Rails5、设计嵌套属性,不允许参数
Rails 5, devise nested attributes, unpermitted parameters
我在 Rails 应用程序的 Ruby 中使用 Devise。当用户注册或更新他们的帐户时,我也想创建/更新他们的 AddressInformation
.
class User < ApplicationRecord
belongs_to :address_information
accepts_nested_attributes_for :address_information, allow_destroy: true
[...]
我的 _form.html.haml
看起来像这样:
= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f|
= devise_error_messages!
.form-group
= f.label :name
= f.text_field :name
= f.fields_for :address_informations, resource.address_information do |address_field|
.form-group
= address_field.label :address
= address_field.text_field :address
.form-group
= address_field.label :care_of
= address_field.text_field :care_of
.form-group
= address_field.label :zip_code
= address_field.text_field :zip_code
.form-group
= address_field.label :city
= address_field.text_field :city
我试过这样添加属性:
class Users::RegistrationsController < Devise::RegistrationsController
before_action :configure_sign_up_params, only: [:create]
before_action :configure_account_update_params, only: [:update]
[...]
# If you have extra params to permit, append them to the sanitizer.
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [
:name,
address_information: [
:address,
:care_of,
:zip_code,
:country,
:state
]
])
end
当我尝试更新用户时出现以下错误:
Unpermitted parameter: :address_informations
(0.2ms) BEGIN
(0.2ms) ROLLBACK
关于我遗漏的任何想法?
在您的表单定义中,资源名称是复数形式
= f.fields_for :address_informations, resource.address_information do |address_field|
因为您需要 :address_information
的属性,您应该将其更改为
= f.fields_for :address_information, resource.address_information do |address_field|
此外,在使用 strong parameters and nested attributes 时,您应该将 _attributes
后缀附加到属性名称 - address_information_attributes
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [
:name,
address_information_attributes: [
:address,
:care_of,
:zip_code,
:country,
:state
]
])
end
我在 Rails 应用程序的 Ruby 中使用 Devise。当用户注册或更新他们的帐户时,我也想创建/更新他们的 AddressInformation
.
class User < ApplicationRecord
belongs_to :address_information
accepts_nested_attributes_for :address_information, allow_destroy: true
[...]
我的 _form.html.haml
看起来像这样:
= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f|
= devise_error_messages!
.form-group
= f.label :name
= f.text_field :name
= f.fields_for :address_informations, resource.address_information do |address_field|
.form-group
= address_field.label :address
= address_field.text_field :address
.form-group
= address_field.label :care_of
= address_field.text_field :care_of
.form-group
= address_field.label :zip_code
= address_field.text_field :zip_code
.form-group
= address_field.label :city
= address_field.text_field :city
我试过这样添加属性:
class Users::RegistrationsController < Devise::RegistrationsController
before_action :configure_sign_up_params, only: [:create]
before_action :configure_account_update_params, only: [:update]
[...]
# If you have extra params to permit, append them to the sanitizer.
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [
:name,
address_information: [
:address,
:care_of,
:zip_code,
:country,
:state
]
])
end
当我尝试更新用户时出现以下错误:
Unpermitted parameter: :address_informations
(0.2ms) BEGIN
(0.2ms) ROLLBACK
关于我遗漏的任何想法?
在您的表单定义中,资源名称是复数形式
= f.fields_for :address_informations, resource.address_information do |address_field|
因为您需要 :address_information
的属性,您应该将其更改为
= f.fields_for :address_information, resource.address_information do |address_field|
此外,在使用 strong parameters and nested attributes 时,您应该将 _attributes
后缀附加到属性名称 - address_information_attributes
def configure_account_update_params
devise_parameter_sanitizer.permit(:account_update, keys: [
:name,
address_information_attributes: [
:address,
:care_of,
:zip_code,
:country,
:state
]
])
end