更改 form_for 提交的 ActiveModel

Changing the ActiveModel submitted by a form_for

我有一个允许我的管理员创建用户的表单。我正在使用 STI,因此管理员可以指定 AdminUser 的类型。如果我提交包含无效信息的表单并且保存失败,我的控制器将使用 @user 模型重新呈现表单,如下所示:

def create
    @user = User.new(user_params)

    if @user.save
      redirect_to admin_users_path, notice: "#{@user.first_name} #{@user.last_name} user created"
    else
      render :new
  end
end

我 运行 的问题是提交按钮现在提交的散列包含 admin 的信息而不是 user,这意味着我的白名单参数方法没有工作:

def user_params
    params.require(:user).permit(:email, :first_name, :last_name, :password,
      :password_confirmation, :type, :role_id)
end

有什么方法可以修改提交按钮,使其作为 user 而不是 admin 提交?

以及带有按钮的视图:

.col-md-6.col-md-offset-3
  = form_for [:admin, @user], html: {role: :form}, url: admin_users_path do |f|
    - if @user.errors.any?
      %h2= "#{pluralize(@user.errors.count, "error")} prohibited this user from being saved:"
      %ul
        - @user.errors.full_messages.each do |msg|
          %li= msg

    .row
      #first_name.form-group
        = f.label :first_name
        = f.text_field :first_name, autofocus: true, class: 'form-control'

    .row
      #last_name.form-group
        = f.label :last_name
        = f.text_field :last_name, class: 'form-control'

    .row
      #email.form-group
        = f.label :email
        = f.email_field :email, class: 'form-control'

    .row
      .col-md-6
        #user_type.form_group
          = f.label :type
          = f.select :type, options_for_select(%w{Customer Admin}, selected: @user.type), class: 'form-control'

      .col-md-6
        #admin_role.form-group
          = f.label :role
          = f.collection_select :role_id, Role.all, :id, :name

    .row
      #password.form-group
        = f.label :password
        = f.password_field :password, class: 'form-control'

    .row
      #password_confirmation.form-group
        = f.label :password_confirmation
        = f.password_field :password_confirmation, class: 'form-control'

    #submit.actions.text-center
      = f.submit

您可以在 form_for 中添加 as: :user 选项。 Rails docs.

中有更多详细信息