创建具有嵌套属性的设计用户时不允许的参数

Unpermitted params when creating a devise user with nested attributes

我目前正在尝试创建一个具有一些嵌套属性的设计用户。每个 User has_many :companiesaccepts_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

--

如果这个答案过于宽泛,我会删除它 - 我觉得有必要向可能发现这个问题的任何人澄清情况。