【问题标题】:How to create an object of a STI subclass using ActiveAdmin如何使用 ActiveAdmin 创建 STI 子类的对象
【发布时间】:2012-07-16 01:48:16
【问题描述】:

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

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

有人知道解决方法吗?

【问题讨论】:

    标签: ruby-on-rails activeadmin


    【解决方案1】:

    您可以自己自定义控制器。阅读ActiveAdmin Doc on Customizing Controllers。这是一个简单的例子:

    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
    

    【讨论】:

      【解决方案2】:

      较新版本的inherited_resources gem 有一个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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-06
        • 1970-01-01
        • 2019-05-03
        • 2021-11-17
        • 1970-01-01
        相关资源
        最近更新 更多