0

Я все еще пытаюсь обернуть мою голову вокруг Сильных параметров в Rails 4. Я получаю ActiveModel::ForbiddenAttributesError при попытке отправить форму с Params для другой модели, что belongs_to.Rails4: ForbiddenAttributesError на Params вложенного родителя

Product :has_many DiskFiles

Через некоторое слежки я понимаю, что мне нужно, чтобы символизировать свои ключи, прежде чем передать их в нечто подобное, иначе я получу ForbiddenAttributesError. Так что это будет работать:

#disk_files_controller.rb 
def update 
    product = @disk_file.create_product(params[:product].symbolize_keys) if params[:product] 
    ... 
end 

инспектирующего Params [: продукт]:

>> params[:product] 
=> {"title"=>"Registration Test5", "year"=>"1988", "region_id"=>"7"} 

в любом случае я разрешающий этот Params (среди прочих):

def disk_file_params 
    params.require(:disk_file).permit(:filename, :file_path, :title, 
            :product, :year, :region_id) 
end 

Будучи, как все params изначально strings, тогда мы должны разрешить версию параметров string вместо symbol?!? Не знаете, что лучше всего здесь?!? Я знаю, что шаблоны Rails 4 содержат символизированные параметры.

ответ

1
  1. Не нужно вручную звонить #symbolize_keys. рельсы делают это за вас.
  2. вы можете использовать вложенные атрибуты в StrongParams таким образом

    params.require(:model_name_here).permit(:attribute1, :attribute2, :attribute3, nested_model_name_here: [:attribute1, :attribute2, :attribute3])

так что вы можете сделать что-то вроде этого:

params.require(:product).permit(:title, :year, :region_id, disk_file: [:filename, :file_path, :title, 
           :product, :year, :region_id]) 

Это предполагает, что disk_file «s атрибуты вложен внутри product для параметров hash. Если вы все еще получаете сообщение об ошибке, отправьте фиктивное приложение на github, которое воспроизводит это поведение. поэтому я могу помочь вам дальше. Thanks

+0

блестящий; благодаря! ': product' - это встроенная модель для этой конкретной формы, поэтому' params.require (: disk_file) .permit (: filename,: file_path, product: [: title,: year,: region_id]) 'работал для меня! – Meltemi

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