Rails:嵌套父类的参数上的ForbiddenAttributesError

时间:2013-08-13 21:23:08

标签: ruby-on-rails ruby-on-rails-4 params actioncontroller strong-parameters

我仍然试图在Rails 4中绕过强参数。我在尝试提交一个带有参数的表单时获得ActiveModel::ForbiddenAttributesError,而另一个模型是{ {1}}。

belongs_to

经过一番调查,我意识到我需要在将它们传递到这样的东西之前对其进行符号化,否则我将得到Product :has_many DiskFiles。所以这将有效:

ForbiddenAttributesError

检查params [:product]:

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

在任何一种情况下我都允许这些参数(等等):

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

由于所有参数最初都是def disk_file_params params.require(:disk_file).permit(:filename, :file_path, :title, :product, :year, :region_id) end ,那么我们是否应该允许strings版本的参数而不是string?!?不确定这里的最佳做法是什么?!?我知道Rails 4模板包含符号化参数。

1 个答案:

答案 0 :(得分:1)

  1. 无需手动拨打#symbolize_keys。 rails为你做这件事。
  2. 您可以通过这种方式在StrongParams中使用嵌套属性

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

  3. 所以你可以这样做:

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

    这假设disk_file的属性嵌套在product内,用于params散列。如果您仍然收到错误,请在github上发布一个虚拟应用程序,它会重现此行为。所以我可以进一步帮助你。感谢