4

鉴于以下设置(目前不工作)

class Employee < ActiveRecord::Base
end

class Manager < Employee
end

ActiveAdmin.register Employee do
  form do |f|
    f.input :name
    f.input :joining_date
    f.input :salary
    f.input :type, as: select, collection: Employee.descendants.map(&:name)
  end
end

我想为所有员工提供一个单一的“新”表格,并能够在表格中选择员工的 STI 类型。我能够按预期看到“类型”的选择框,但是当我点击“创建”按钮时,出现以下错误:

ActiveModel::MassAssignmentSecurity::Error in Admin::EmployeesController#create

Can't mass-assign protected attributes: type

现在,我知道受保护的属性在 Rails 中的工作方式,并且我有一些解决方法,例如定义Employee.attributes_protected_by_default,但这会降低安全性并且过于 hack-y。

我希望能够使用 ActiveAdmin 中的某些功能来做到这一点,但我找不到。我不想创建自定义控制器操作,因为我展示的示例高度简化和做作。

我希望 ActiveAdmin 生成的控制器能够以某种方式识别type并执行,Manager.create而不是Employee.create

有谁知道解决方法?

4

2 回答 2

9

You can customize the controller yourself. Read ActiveAdmin Doc on Customizing Controllers. Here is a quick example:

controller do
  alias_method :create_user, :create
  def create
    # do what you need to here
    # then call create_user alias
    # which calls the original create
    create_user
    # or do the create yourself and don't
    # call create_user
  end
end
于 2012-08-05T16:39:41.823 回答
1

较新版本的inherited_resourcesgem 有一个BaseHelpers模块。您可以覆盖其方法以更改模型的更改方式,同时仍保留所有周围的控制器代码。它比 干净一点alias_method,并且它们具有所有标准 REST 操作的挂钩:

controller do
  # overrides InheritedResources::BaseHelpers#create_resource
  def create_resource(object)
    object.do_some_cool_stuff_and_save
  end

  # overrides InheritedResources::BaseHelpers#destroy_resource
  def destroy_resource(object)
    object.soft_delete
  end
end
于 2020-09-25T01:01:39.273 回答