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”并倒计时。另一种方法是时间戳,例如,
(快速,但不适用于)您的用户模型中是否有“接受银行账户的嵌套属性”?是的,我正在升级到Rails 4,这在Rails 3上起作用。Date.now()
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"=>{}}