0

我仍在尝试围绕Rails 4 中的强参数ActiveModel::ForbiddenAttributesError。当我尝试为另一个模型提交带有参数的表单时,我得到了一个它belongs_to

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[: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参数的版本而不是symbol?!? 不确定这里的最佳做法是什么?!?我知道 Rails 4 模板包含符号化参数。

4

1 回答 1

1
  1. 无需手动调用#symbolize_keys。rails 为你做这件事。
  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 的属性嵌套在productparams 散列中。如果您仍然收到错误,请在 github 上发布一个虚拟应用程序来重现此行为。所以我可以进一步帮助你。谢谢

于 2013-08-13T21:35:45.423 回答