【问题标题】:Rails4: ForbiddenAttributesError on nested parent's paramsRails4:嵌套父级参数上的 ForbiddenAttributesError
【发布时间】:2013-08-13 21:23:07
【问题描述】:

我仍在尝试围绕 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

检查参数[:product]:

>> 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 模板包含符号化参数。

【问题讨论】:

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


    【解决方案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 的属性嵌套在product 中用于参数哈希。如果您仍然收到错误,请在 github 上发布一个虚拟应用程序来重现此行为。所以我可以进一步帮助你。谢谢

    【讨论】:

    • 辉煌;谢谢! :product 是此特定表单上的嵌入式模型,因此 params.require(:disk_file).permit(:filename, :file_path, product: [:title, :year, :region_id]) 为我工作!
    猜你喜欢
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多