我仍然试图在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模板包含符号化参数。
答案 0 :(得分:1)
#symbolize_keys
。 rails为你做这件事。您可以通过这种方式在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
内,用于params散列。如果您仍然收到错误,请在github上发布一个虚拟应用程序,它会重现此行为。所以我可以进一步帮助你。感谢