【问题标题】:Nested form with simple_form and strong parameters具有 simple_form 和强参数的嵌套表单
【发布时间】:2014-03-19 12:37:45
【问题描述】:

与 simple_form 的嵌套 has_many 关联返回以下参数哈希:

params
# => {
       "user"=>{
         "first_name"=>"John",
         "last_name"=>"Doe",
         "bank_accounts_attributes"=>{
           "-1"=>{
             "_destroy"=>"0",
             "iban"=>"fakeiban",
             "bic"=>"fakebic"
           },
           "new-bank-account"=>{
             "_destroy"=>"0",
             "iban"=>"",
             "bic"=>""
           }
         }
       }
     }

键“-1”是通过复制 DOM 中的“new-bank-account”模板(由于 iban 为空白而被忽略)创建的新的尚未持久化的 bank_accout。

我如何允许这些用于强参数?

我尝试了以下方法无济于事:

permitted_params = {
  :first_name,
  :last_name,
  { 
    :bank_accounts_attributes=>[:iban, :bic]
  }
}

params.require(:user).permit(*permitted_params)
Unpermitted parameters: -1, new-bank-account
# => {
       "user"=>{
         "first_name"=>"John",
         "last_name"=>"Doe",
         "bank_accounts_attributes"=>{}
       }
     }

我在这里做错了什么?

更新:

以下工作,但我不想在任何地方明确地包含否定键(代表未持久关系):

params.require(:user).permit(:first_name, :last_name,  bank_accounts_attributes: {"-1" => [:iban, :bic]})

更新 2:

问题似乎是“新银行帐户”键:

p = ActionController::Parameters.new user: { first_name: "Foo", bank_accounts_attributes: {"-1" => {iban: 'xxx'}, "-2" => {iban: 'yyy'}}}
p.require(:user).permit(:first_name, bank_accounts_attributes: :iban)
# => {"first_name"=>"Foo", "bank_accounts_attributes"=>{"-1"=>{"iban"=>"xxx"}, "-2"=>{"iban"=>"yyy"}}}

p = ActionController::Parameters.new user: { first_name: "Foo", bank_accounts_attributes: {"-1" => {iban: 'xxx'}, "new-bank-account" => {iban: 'yyy'}}}
p.require(:user).permit(:first_name, bank_accounts_attributes: :iban)
# => {"first_name"=>"Foo", "bank_accounts_attributes"=>{}}

看来我必须在提交表单之前从 DOM 中删除模板“new-bank-account”。

【问题讨论】:

  • 你的用户模型中有 'accepts_nested_attributes_for :bank_accounts' 吗?
  • 是的,我正在升级到 Rails 4,这适用于 Rails 3。

标签: ruby-on-rails strong-parameters


【解决方案1】:

我会回答我自己的问题:

只有当它们是整数时,强参数才接受 has_many 键。一个非整数键足以让所有嵌套记录从 params 散列中消失。因此有两种解决方案:

  • 为模板使用非整数键,例如“new-entry”,并在提交表单之前将其从 DOM 中删除。
  • 如果您像我一样不想要这个额外的 JS 代码,请为模板使用保留的数字键,例如“999999”,并确保新的、未持久的嵌套记录不会发生冲突。由于持久记录的键是“0”、“1”等,我们使用一个分配“-1”并倒计时的计数器。另一种方法是时间戳,例如Date.now()(速度快,但不适用于 +new Date()(速度较慢,但​​适用于 IE8)。

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多