我一次提交一个包含2-4个对象的表单,具体取决于父对象的数量。我知道这可能是非常规的,但我真的希望用户能够在一个表单上一次编辑所有对象。在我的表格上,我在做:
<%= simple_fields_for "derps[]", derp do |f| %>
<% end %>
然后我在控制器中这样做:
def update
@derps = []
@rejects = []
derps_params.each do |key, hash|
derp = Derp.find(key)
derp.assign_attributes(hash)
@rejects << derp unless derp.save
end
if @rejects.empty?
redirect_to @parent, flash: {success: 'Derps were successfully updated.'}
else
@derps = @rejects
render :edit
end
end
假设有两个对象-参数如下:
"derps"=>{"1"=>{"attribute"=>"39", "another_attribute"=>"serp", "a_third_attribute"=>"yerp"}, "2"=>{"attribute"=>"30", "another_attribute"=>"49", }}
我在Rails 3中没有强参数。我正在升级到rails 4,我正在努力解决如何让它工作-我一直得到“不允许的参数:1、2”
我假设我需要做一些事情,比如:
def mashes_params
params.require(:derps).permit(
id: []
或
def mashes_params
params.require(:derps).permit(
:id,
沿着这些线的东西,但我已经尝试了每一种方法,我能想到的运气不好。
有什么想法吗?
6条答案
按热度按时间dgsult0t1#
我发现命令行对于在Rails 4中调试强参数非常有帮助。下面是我如何在控制台中测试您的问题:
希望有了这个工具,您能够调试我的答案没有提供的任何东西,这比试错更容易。
68bkxrlz2#
最后一次编辑(希望):
我得从头开始重新考虑。我得出的结论是:既然:id可以作为一个键值,但不允许作为哈希的键,为什么不总是将键设置为1-4,这样我就可以显式地将它们列入白名单,然后从哈希中的键值中获取ID,就像在传统的表单嵌套中所做的那样?这就是我最终解决它的方式。下面是我正在做的最后一个实现:
然后在控制器中:
下面是强参数:
希望这对某人有帮助。
qq24tv8q3#
我见过的最好的解决方案是:
我通过未命名的键做了一个修改,因为我的
property_keys
有更多的嵌套键和值:e4yzc0pl4#
这是我目前使用的方法。你可以像这样一个接一个地允许每个嵌套的参数:
6ss1mwsb5#
这里是一种肮脏的方式来实现这一点的基础上的答案以上由格雷格布拉斯
这可以处理无限多个带有嵌套参数的索引
我相信有一个更好的方法来做到这一点,但这种方式是可读的,我可以很容易地告诉发生了什么事......最重要的是,它的工作
cigdeys36#
在控制器中,到目前为止我发现的最干净的解决方案是这样的:
如果您确实希望在缺少键时引发异常,请先调用
#require
或在#fetch
中引发异常。当然,如果您经常使用这种模式,您可以在ApplicationController中用一个方便的方法来 Package 所有这些。
额外提示:
fields_for
表单助手接受:index
选项。