创建具有嵌套属性的设计用户时不允许的参数
Unpermitted params when creating a devise user with nested attributes
我目前正在尝试创建一个具有一些嵌套属性的设计用户。每个 User
has_many :companies
和 accepts_nested_attributes_for :companies
。当管理员将用户添加到系统时,我想自动创建一个相应的 Company
并在用户注册表单中获取其一些基本信息。这意味着我在表单中嵌套了一些 Company
字段。
问题是,虽然我能够很好地创建用户,但嵌套公司被拒绝并出现错误。
Unpermitted parameter: company
下面是我的代码
application_controller.rb 注意:companies_params
只是在那里看看是否需要(我实际上不知道是否有必要)
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:account_update) {|u|
u.permit(:password, :password_confirmation, :current_password, companies_attributes: [:id, :name, :street, :city, :state, :zip, :_destroy])}
devise_parameter_sanitizer.for(:sign_up) {|u|
u.permit(:password, :password_confirmation, :current_password, companies_attributes: [:id, :name, :street, :city, :state, :zip, :_destroy])}
end
users_controller.rb
def new
@user=User.new
@company=@user.companies.build
end
def create
@user = User.new(user_params)
if @user.save
redirect_to users_admin_path(@user), notice: "User successfuly created!"
else
redirect_to welcome_index_path
end
end
private
def user_params
params.require(:user).permit(:id, :email, :role, :password, :password_confirmation, companies_attributes: [:id, :name, :street, :city, :state, :zip, :_destroy])
end
_form.html.erb
<%= simple_form_for @user, url: url_for(action: 'create', controller: 'users') do |f| %>
<fieldset>
<ol>
<li class="required">
<%= f.label :email %>
<%= f.email_field :email, size: 40 %>
</li>
<li class="required">
<%= f.label :password %>
<%= f.password_field :password, size: 40 %>
</li>
<li class="required">
<%= f.label :password_confirmation, "Confirm Password" %>
<%= f.password_field :password_confirmation, size: 40 %>
</li>
</ol>
<%= f.simple_fields_for @company do |company| %>
<div class="field">
<%= company.input :name, label: "Name" %>
</div>
<% end %>
<%= f.submit "Create Account" %>
</fieldset>
<% end %>
任何想法都会有所帮助。
原来我在 simple_fields_for
中嵌套 :companies
的方式有问题。
原来只能用一个
<%= f.simple_fields_for :companies do |company| %>
或
<%= f.simple_fields_for @user.companies do |company| %>
但是从来没有
<%= f.simple_fields_for @company do |company| %>
对象
为了给你一些上下文,你必须记住,当你使用 form_for
时,它的目的是构建一个单一的对象(在本例中,@user
)。
当您使用 f.fields_for
时,您正在调用此对象的 嵌套 属性。
因此,您必须调用 fields_for
作为父对象的一部分。您的传递 @company
将无法按您的需要工作;您需要调用 parent 对象的嵌套元素,这就是为什么只有以下工作:
<%= f.fields_for :companies ... %>
<%= f.fields_for @user.companies .... %>
当然,这必须伴随 build
命令 - 在控制器中构建嵌套对象,您已经完成了...
def new
@user = User.new
@user.companies.build
end
--
如果这个答案过于宽泛,我会删除它 - 我觉得有必要向可能发现这个问题的任何人澄清情况。
我目前正在尝试创建一个具有一些嵌套属性的设计用户。每个 User
has_many :companies
和 accepts_nested_attributes_for :companies
。当管理员将用户添加到系统时,我想自动创建一个相应的 Company
并在用户注册表单中获取其一些基本信息。这意味着我在表单中嵌套了一些 Company
字段。
问题是,虽然我能够很好地创建用户,但嵌套公司被拒绝并出现错误。
Unpermitted parameter: company
下面是我的代码
application_controller.rb 注意:companies_params
只是在那里看看是否需要(我实际上不知道是否有必要)
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:account_update) {|u|
u.permit(:password, :password_confirmation, :current_password, companies_attributes: [:id, :name, :street, :city, :state, :zip, :_destroy])}
devise_parameter_sanitizer.for(:sign_up) {|u|
u.permit(:password, :password_confirmation, :current_password, companies_attributes: [:id, :name, :street, :city, :state, :zip, :_destroy])}
end
users_controller.rb
def new
@user=User.new
@company=@user.companies.build
end
def create
@user = User.new(user_params)
if @user.save
redirect_to users_admin_path(@user), notice: "User successfuly created!"
else
redirect_to welcome_index_path
end
end
private
def user_params
params.require(:user).permit(:id, :email, :role, :password, :password_confirmation, companies_attributes: [:id, :name, :street, :city, :state, :zip, :_destroy])
end
_form.html.erb
<%= simple_form_for @user, url: url_for(action: 'create', controller: 'users') do |f| %>
<fieldset>
<ol>
<li class="required">
<%= f.label :email %>
<%= f.email_field :email, size: 40 %>
</li>
<li class="required">
<%= f.label :password %>
<%= f.password_field :password, size: 40 %>
</li>
<li class="required">
<%= f.label :password_confirmation, "Confirm Password" %>
<%= f.password_field :password_confirmation, size: 40 %>
</li>
</ol>
<%= f.simple_fields_for @company do |company| %>
<div class="field">
<%= company.input :name, label: "Name" %>
</div>
<% end %>
<%= f.submit "Create Account" %>
</fieldset>
<% end %>
任何想法都会有所帮助。
原来我在 simple_fields_for
中嵌套 :companies
的方式有问题。
原来只能用一个
<%= f.simple_fields_for :companies do |company| %>
或
<%= f.simple_fields_for @user.companies do |company| %>
但是从来没有
<%= f.simple_fields_for @company do |company| %>
对象
为了给你一些上下文,你必须记住,当你使用 form_for
时,它的目的是构建一个单一的对象(在本例中,@user
)。
当您使用 f.fields_for
时,您正在调用此对象的 嵌套 属性。
因此,您必须调用 fields_for
作为父对象的一部分。您的传递 @company
将无法按您的需要工作;您需要调用 parent 对象的嵌套元素,这就是为什么只有以下工作:
<%= f.fields_for :companies ... %>
<%= f.fields_for @user.companies .... %>
当然,这必须伴随 build
命令 - 在控制器中构建嵌套对象,您已经完成了...
def new
@user = User.new
@user.companies.build
end
--
如果这个答案过于宽泛,我会删除它 - 我觉得有必要向可能发现这个问题的任何人澄清情况。