【问题标题】:Modifying the params hash in Rails在 Rails 中修改 params 哈希
【发布时间】:2012-03-20 19:45:08
【问题描述】:

我正在 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 的字段。假设我希望 companyid 成为“公司”,然后我认为这会起作用:

len = params["dummy"]["users_attributes"].size
 counter = 0
 while counter < len
  params["dummy"]["users_attributes"][counter]["companyid" => "company"]
  counter = counter + 1
end

但是,我在 while 循环的第一行收到“nil:NilClass 的未定义方法 `[]'”错误。我不太清楚为什么。

有人可以帮我修改参数哈希吗?

编辑: 所以,我终于想通了。我并没有真正使用任何解决方案。首先,我将 companyid 的 hidden_​​field 标记设置为空白。然后,在我的控制器中输入:

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

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 nested-attributes


    【解决方案1】:

    params 哈希是特殊的,因为(尤其是表单)它与与之相关的模型一对一映射,并且 Rails 期望在模型中存在数据库列或方法有这个名字。

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

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

    如果数据不是敏感,您只需确保在各自的模型中将用户可以更改的值声明为attr_accessible(防止批量分配)并将其他值放在隐藏字段中.

    【讨论】:

    • 我给你支票是因为你对隐藏字段的深入讨论让我找到了解决方案。谢谢!
    • 我在正确性上的不足,我用冗长来弥补。我应该是一名Java程序员! (哦,等等,我是)。那么, 解决方案是什么?
    • 在原帖的编辑中:f.hidden_​​field :companyid 的形式,然后是上面的代码sn-p
    【解决方案2】:

    这看起来很难看,我不明白发生了什么,但你的错误是:

    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

    【讨论】:

      【解决方案3】:

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

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

      编辑除了 fl00r 的回答,是的,您必须先将 ["companyid"] 设置为 {}。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多