Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 具有简单_形式和强参数的嵌套形式_Ruby On Rails_Strong Parameters - Fatal编程技术网

Ruby on rails 具有简单_形式和强参数的嵌套形式

Ruby on rails 具有简单_形式和强参数的嵌套形式,ruby-on-rails,strong-parameters,Ruby On Rails,Strong Parameters,嵌套的与简单表单的多个关联返回以下参数散列: params # => { "user"=>{ "first_name"=>"John", "last_name"=>"Doe", "bank_accounts_attributes"=>{ "-1"=>{ "_destroy"=>"0", "iban"=>"fa

嵌套的与简单表单的多个关联返回以下参数散列:

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中的“新银行帐户”模板创建的一个新的、尚未持久化的银行帐户(由于iban为空,该模板被忽略)

我如何允许这些强参数

我尝试了以下方法,但没有效果:

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:

问题似乎是“新银行账户”密钥:


在提交表单之前,我似乎必须从DOM中删除模板“新银行帐户”。

我将回答我自己的问题:

强参数只有当它们是整数时才有许多键。一个非整数键足以使所有嵌套记录从params散列中消失。因此,有两种解决办法:

  • 为模板使用非整数键,例如“newentry”,并在提交表单之前将其从DOM中删除

  • 如果你和我一样,不想要这个额外的JS代码,请为模板使用保留的数字键,如“9999999”,并确保新的、未持久化的嵌套记录不会冲突。由于持久化记录的键是“0”、“1”等,因此我们使用一个计数器来分配“-1”并倒计时。另一种方法是时间戳,例如,
    Date.now()
    (快速,但不适用于)您的用户模型中是否有“接受银行账户的嵌套属性”?是的,我正在升级到Rails 4,这在Rails 3上起作用。
    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"=>{}}