2012-03-20 120 views
6

我在Rails中创建了一个嵌套模型,但是我希望将字段添加到控制器中的嵌套模型中。我没有使用hidden_​​field_tag,因为它可能被篡改。在Rails中修改参数哈希值

这里是我的PARAMS哈希:

Parameters: {"dummy"=>{"users_attributes"=>{"0"=>{"email"=>"[email protected]", "id"=>"", "_destroy"=>"false"}, "1"=>{"email"=>"[email protected]", "id"=>"", "_destroy"=>"false"}}}, "commit"=>"Create Dummy"} 

我想是因为有被称为companyid每个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 

但是,我得到“未定义的方法`[]”为无:NilClass”错误的,而第一线循环。我不完全确定为什么。

有人可以帮助我,所以我可以修改参数哈希?编辑: 所以,我终于弄明白了。我没有真正使用任何解决方案。首先,我为companyid设置一个hidden_​​field标记为空白。然后,在我的控制,我把:

params["dummy"]["users_attributes"].each do |key, val| 
    params["dummy"]["users_attributes"][key]["companyid"] = "company" 
end 

不是最优雅的代码,但它会工作。

回答

4

params散列是特殊的,因为(特别是对于窗体)它与它所关联的模型一对一映射,并且Rails期望那里有一个数据库列或者一个方法有这个名字的模型。

隐藏字段是获取附加数据问题的典型解决方案,但如果您不希望用户看到这些字段,则会遇到HTTP无状态的问题。所以在这种情况下,session[:something]是你的朋友。在显示可能具有隐藏数据的表单或页面之前,请将数据添加到会话变量(首先对其进行加密),然后在用户提交表单时读取(并解密)。或者,您可以将其保存在数据库表中,并在会话中仅放置行ID,以便在发布表单时读回数据。

如果数据模型的一部分,但您只是不想显示它,您可以只显示用户可以在视图中看到的部分,然后在其中查看其余部分控制器在用户提交表单或请求时的操作。

如果数据不是敏感你可以确保申报用户可以在各自的车型attr_accessible更改值(防止质量分配),并把其他人隐藏字段。

+0

我给你的检查,因为你深入讨论隐藏领域让我找出解决方案。谢谢! – NielMalhotra 2012-03-20 20:54:56

+2

我缺乏正确性,我弥补了冗长。我应该是一名Java程序员! (哦,等等,我是)。那么,解决方案是什么? – 2012-03-20 23:48:20

+0

它在原始文章的编辑中:f.hidden_​​field:表单中的companyid,然后是上面的代码片段 – NielMalhotra 2012-03-21 05:38:41

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和控制器初始化新的公司,而不是这个丑陋的代码

http://railscasts.com/episodes/196-nested-model-form-part-1

http://railscasts.com/episodes/197-nested-model-form-part-2

0

这不是哈希的工作方式。试试这个:

params["dummy"]["users_attributes"][counter]["companyid"] = "company" 

编辑除了fl00r的回答,是的,你必须设置[ “companyid”]为{}第一。