我在Rails中创建了一个嵌套模型,但我想在控制器中的嵌套模型中添加字段。我没有使用hidden_field_tag,因为它可能被篡改。
这是我的参数哈希:
Parameters: {"dummy"=>{"users_attributes"=>{"0"=>{"email"=>"jjjj@gmail.com", "id"=>"", "_destroy"=>"false"}, "1"=>{"email"=>"qqq@gmail.com", "id"=>"", "_destroy"=>"false"}}}, "commit"=>"Create Dummy"}
我想要的是在每个user_attributes下有一个名为companyid的字段。让我们说我想让公司成为“公司”,然后我认为这样可行:
len = params["dummy"]["users_attributes"].size
counter = 0
while counter < len
params["dummy"]["users_attributes"][counter]["companyid" => "company"]
counter = counter + 1
end
但是,我得到“未定义的方法`[]'为nil:nilClass”错误为while循环中的第一行。我不确定为什么。
有人可以帮助我,所以我可以修改params哈希吗?
编辑: 所以,我终于明白了。我并没有真正使用任何解决方案。首先,我为hiddenid设置了hidden_field标记为空白。然后,在我的控制器中,我把:
params["dummy"]["users_attributes"].each do |key, val|
params["dummy"]["users_attributes"][key]["companyid"] = "company"
end
不是最优雅的代码,但它会起作用。
答案 0 :(得分:4)
params散列是特殊的,因为(特别是对于表单)它是与它相关的模型一对一映射的,Rails期望有一个数据库列或模型中的方法有这个名字。
隐藏字段是获取其他数据问题的典型解决方案,但如果您不希望用户看到这些字段,则会遇到HTTP无状态的问题。所以在这种情况下,session[:something]
是你的朋友。在显示可能具有隐藏数据的表单或页面之前,请将数据添加到会话变量(首先加密),然后在用户提交表单时可以读取(和解密)。或者您可以将其保存在数据库表中,并仅在会话中放入行ID,以便在发布表单时回读数据。
如果数据 是模型的一部分,但您只是不想显示它,您可以只显示用户在视图中可以看到的部分,然后再查看其余部分当用户提交表单或请求时,它在控制器操作中。
如果数据不是敏感,您可以确保在各自的模型中声明用户可以更改为attr_accessible
的值(防止批量分配)并将其他人放入其中隐藏的领域。
答案 1 :(得分:0)
这看起来很难看,我不明白发生了什么,但你的错误是:
len = params["dummy"]["users_attributes"].size
counter = 0
while counter < len
params["dummy"]["users_attributes"][counter] = { "companyid" => "company" }
counter = counter + 1
end
我相信你应该在这里使用accepts_nested_attributes_for
并在控制器中初始化新公司,而不是这个丑陋的代码
答案 2 :(得分:0)
这不是哈希的工作方式。试试这个:
params["dummy"]["users_attributes"][counter]["companyid"] = "company"
编辑除了fl00r的回答,是的,您必须先将[“companyid”]设置为{}。