首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails4:嵌套父母params上的ForbiddenAttributesError

Rails4:嵌套父母params上的ForbiddenAttributesError
EN

Stack Overflow用户
提问于 2013-08-13 21:23:07
回答 1查看 2.4K关注 0票数 0

我仍然试图在Rails 4中使用强参数,当我尝试为另一个模型提交一个带有params的表单时,我得到了一个ActiveModel::ForbiddenAttributesError

Product :has_many DiskFiles

经过一番调查后,我意识到在把钥匙传递到类似的东西之前,我需要把钥匙符号化,否则我就会得到ForbiddenAttributesError。所以这是可行的:

代码语言:javascript
运行
复制
#disk_files_controller.rb
def update
     product = @disk_file.create_product(params[:product].symbolize_keys) if params[:product]
    ...
end

巡检:产品

代码语言:javascript
运行
复制
>> params[:product]
=> {"title"=>"Registration Test5", "year"=>"1988", "region_id"=>"7"}

在任何一种情况下,我都允许这些参数(除其他外):

代码语言:javascript
运行
复制
def disk_file_params
  params.require(:disk_file).permit(:filename, :file_path, :title,
                                    :product, :year, :region_id)
end

既然所有参数最初都是strings,那么我们是否应该允许string版本的params而不是symbol?!?不知道这里的最佳做法是什么??我知道Rails 4模板包括符号化的参数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-13 21:35:45

  1. 不需要手动调用#symbolize_keys。rails是为你做的。
  2. 可以以这种方式在StrongParams中使用嵌套属性。 params.require(:model_name_here).permit(:attribute1, :attribute2, :attribute3, nested_model_name_here: [:attribute1, :attribute2, :attribute3])

所以你可以这样做:

代码语言:javascript
运行
复制
params.require(:product).permit(:title, :year, :region_id, disk_file: [:filename, :file_path, :title,
                                :product, :year, :region_id])

这是假设disk_file的属性嵌套在product中,用于params散列。如果仍然有错误,请在github上发布一个虚拟应用程序,它会复制这种行为。这样我就可以进一步帮助您了。谢谢

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18219481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档