2015-06-23 4 views
0

Мне нужно создать ревизии для продуктов, так что я должен двигаться редактируемой информации в другой таблицеRails 4, вложенные формы, ActiveModel :: ForbiddenAttributesError

я создал вложенную форму, но возникли проблемы при сохранении данных: ActiveModel :: ForbiddenAttributesError

Как я понимаю, проблема в том, что в наименовании, но я попытался назвать это product_infos, product_infos_attributes и т.д ... ничего не работает

Я также попытался изменить поведение, изменяя

config.action_controller.action_on_unpermitted_parameters = false 

, но я все еще получаю это исключение

работает нормально, если я изменю .create к .new и присвоит все данные вручную, но есть много полей, я предпочел бы использовать массовое назначение

есть способ получить имя поля (ов), которые вызывают проблему?

Код:

Контроллер:

def create 
    product = Product.new(product_params) 

    if product.save params[:product].merge(:user_id => current_user.id) 
    flash[:success] = t('msg.saved') 
    redirect_to product_path(product) 
    else 
    render 'new' 
    end 
end 

def product_params 
    params[:product][:slug] = make_slug(params[:product][:product_info][:caption]) 
    params.require(:product).permit(:image, product_infos: [:caption, :description]) 
end 

модель (продукт):

class Product < ActiveRecord::Base 
    has_many :product_infos 
    accepts_nested_attributes_for :product_infos  

    def save(params) 
    self.user_id = params[:user_id] 
    self.slug = params[:slug] 

    if super 
     # I have this error here 
     revision = self.product_infos.create(params[:product_info]) 

     params[:image].each do |file| 
     self.product_images.create(:image => file) 
     end 

     true 
    end 
    end 
end 

модель (PRODUCT_INFO):

class ProductInfo < ActiveRecord::Base 
    belongs_to :product 
end 

Форма:

<%= form_for @product, :html => {:multipart => true} do |f| %> 

    <%= f.fields_for :product_info do |i| %> 
     <%= i.label :caption %> 
     <%= i.text_field :caption, class: 'form-control', required: 'required' %> 
    <% end %> 
<% end %> 

Ошибка:

ActiveModel::ForbiddenAttributesError in ProductsController#create 
ActiveModel::ForbiddenAttributesError 

Extracted source (around line #57): 
55 
56 
57 
58 
59 
60 


    if super 
     revision = self.product_infos.new(params[:product_info]) 
     revision.caption = params[:product_info][:caption] 
     revision.coordinates = params[:product_info][:coordinates] 
     revision.user_id = params[:user_id] 

Rails.root: /Users/lasoweq/Sites/ruby/eshop 

Application Trace | Framework Trace | Full Trace 
app/models/product.rb:57:in 'save' 
app/controllers/products_controller.rb:22:in 'create' 
Request 

Parameters: 

{"utf8"=>"✓", 
"authenticity_token"=>"Iwg5hdVB+5aAt+Mij8Tg7mMJv+lUr1RXzKciwRVC/ATmtU1FH3odLNaNDhssWz8vbUK+YSTvT0ErB+3cAI5/Tg==", 
"product"=>{"product_info"=>{"caption"=>"Test123", 
"coordinates"=>"13.727685539497559, 
100.63547114393305", 
"description"=>"<p>adasdasdasd</p>", 
"sizes"=>"asdasdasd", 
"height"=>"asdasd", 
"admission"=>"zxczxcz", 
"free_admission"=>"0", 
"custom_info"=>"zxczxczxc"}, 
"categories"=>["", 
"3"], 
"image"=>[#<ActionDispatch::Http::UploadedFile:0x007fd529922c18 @tempfile=#<Tempfile:/var/folders/yt/dtw20h393hvd4xfwcjzhcqxr0000gn/T/RackMultipart20150623-76404-c0nkwa.jpg>, 
@original_filename="GrizzlyBear1920x12005-23-2011_12_51_12_PM.jpg", 
@content_type="image/jpeg", 
@headers="Content-Disposition: form-data; name=\"product[image][]\"; filename=\"GrizzlyBear1920x12005-23-2011_12_51_12_PM.jpg\"\r\nContent-Type: image/jpeg\r\n">, 
#<ActionDispatch::Http::UploadedFile:0x007fd529922ab0 @tempfile=#<Tempfile:/var/folders/yt/dtw20h393hvd4xfwcjzhcqxr0000gn/T/RackMultipart20150623-76404-1si889i.jpg>, 
@original_filename="lion.jpg", 
@content_type="image/jpeg", 
@headers="Content-Disposition: form-data; name=\"product[image][]\"; filename=\"lion.jpg\"\r\nContent-Type: image/jpeg\r\n">]}, 
"commit"=>"Сохранить"} 
+0

Пожалуйста обновите сообщение с кодом модели с ассоциациями – Pavan

+0

Извините, забыли об этом – lasoweq

+1

Попробуйте изменить '<% = f.fields_for: product_info do | i | %> 'to' <% = f.fields_for: product_infos do | i | %> ' – Pavan

ответ

0

Я предполагаю, что ваши ассоциации и модели базы данных правильно установлены. (принадлежит_ модели для модели product_info и has_many для модели продукта)

Вы должны добавить accepts_nested_attributes_for :product_infos в свою модель продукта, чтобы разрешить вложенные атрибуты. Параметр «белый список» в контроллере может быть проблемным вызывателем, но, как представляется, правильно определено в вашем случае.

Попробуйте добавить строку выше к модели.

+0

Извините, я забыл об этом, я обновляю свой код, у меня уже есть эта строка в моей модели – lasoweq

+0

, возможно, стоит посмотреть на камень nested_form от Райана Бейтса. Это действительно облегчает это. Пока он работает с Rails 4, он немного старше. – NickEckhart

0

У вас есть product с has_many отношения к product_infos, поэтому этой линии

<%= f.fields_for :product_info do |i| %> 

должен быть

<%= f.fields_for :product_infos do |i| %> 

А также вы должны изменить :product_infos к :prodcut_infos_attributes в вашем product_params метода

+0

, если я буду использовать 'product_infos', поля не отображаются. Все блоки 'fields_for' отсутствуют, тогда – lasoweq

Смежные вопросы