Permit_params 不适用于自定义创建操作

Ale*_*Vit 1 activeadmin strong-parameters ruby-on-rails-4

我不明白为什么 Permit_params 不能与自定义创建操作一起使用。

例如,我们以基本的 AdminUser 资源为例。

默认情况下一切正常。我们有:

ActiveAdmin.register AdminUser do
  permit_params :email, :password, :password_confirmation

  form do |f|
    f.inputs "Admin Details" do
      f.input :email
      f.input :password
      f.input :password_confirmation
    end
    f.actions
  end
end
Run Code Online (Sandbox Code Playgroud)

但是,一旦我们添加自定义创建,由于某些原因,permit_params 将不再起作用。

ActiveAdmin.register AdminUser do
  permit_params :email, :password, :password_confirmation

  form do |f|
    f.inputs "Admin Details" do
      f.input :email
      f.input :password
      f.input :password_confirmation
    end
    f.actions
  end

  controller do
    def create
      AdminUser.create(params[:admin_user])
      do_some_magic_stuff_here
      redirect_to backend_admin_users_path, notice: 'Custom create'
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我在“AdminUser.create(params[:admin_user])”行中收到错误“ActiveModel::ForbiddenAttributesError”

尝试了很多可能的解决方案,只有一个对我有用,但我真的不喜欢这个:

def create
  AdminUser.create(params[:admin_user].permit(:email, :password, :password_confirmation))
  do_some_magic_stuff_here
  redirect_to admin_admin_users_path, notice: 'Custom create'
end
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我不能以默认方式工作,因为它应该工作:

def admin_user_params
  params.require(:admin_user).permit(:email, :password, :password_confirmation)
end
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这里发生了什么吗?有什么好的方法可以让自定义操作与permit_params一起使用吗?

Jos*_*ach 5

permit_params只是 AA DSL 的一部分,它定义了一个名为 的方法permitted_params,该方法又从创建和更新操作中调用。尝试这个:

permit_params :email, :password, :password_confirmation

controller do
  def create
    @admin_user = AdminUser.create(permitted_params)
    do_some_magic_stuff_here
    redirect_to backend_admin_users_path, notice: "Custom create"
  end
end
Run Code Online (Sandbox Code Playgroud)

permit_params实际上只是旧的更简单的形式,但仍然是启用强参数的有效方法:

controller do
  def permitted_params
    params.permit admin_user: [:email, :password, :password_confirmation]
  end
end
Run Code Online (Sandbox Code Playgroud)