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

时间:2015-10-27 22:15:41

标签: ruby-on-rails ruby-on-rails-4 devise nested-forms strong-parameters

我目前正在尝试使用一些嵌套属性创建一个设计用户。每个User has_many :companies以及accepts_nested_attributes_for :companies。当管理员将用户添加到系统时,我想自动创建相应的Company并在用户注册表单中获取一些基本信息。这意味着我在表单中嵌套了一些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 %>

任何想法都会有所帮助。

2 个答案:

答案 0 :(得分:0)

原来我在:companies嵌套simple_fields_for的方式存在问题。

原来只能使用

<%= f.simple_fields_for :companies do |company| %>

<%= f.simple_fields_for @user.companies do |company| %>

从不

<%= f.simple_fields_for @company do |company| %>

答案 1 :(得分:0)

<强>物件

为了给你一些上下文,你必须记住,当你使用form_for时,它的目标是建立一个单独的对象(在这种情况下,@user)。

使用f.fields_for时,您正在调用此对象的嵌套属性。

因此,您必须调用fields_for作为父对象的一部分。您的通过@company将无法正常运作;你需要调用对象的嵌套元素,这就是为什么只有以下工作:

<%= f.fields_for :companies ... %>
<%= f.fields_for @user.companies .... %>

这当然必须伴随build命令 - 在控制器中构造嵌套对象,你已经完成了......

def new
    @user = User.new
    @user.companies.build
end

-

如果答案过于宽泛,我会删除这个答案 - 我觉得为任何可能发现这个问题的人澄清情况是正确的。