How to create an object of a STI subclass using ActiveAdmin

情到浓时终转凉″ 提交于 2019-12-23 21:24:02

问题


Given the following setup(which is not working currently)

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

I would like to have a single "new" form for all employees and be able to select the STI type of the employee in the form. I am able to see the select box for "type" as intended but when I hit the "Create" button, I get the following error:

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

Can't mass-assign protected attributes: type

Now, I am aware of the way protected attributes work in Rails and I have a couple of workarounds such as defining Employee.attributes_protected_by_default but that is lowering the security and too hack-y.

I want to be able to do this using some feature in ActiveAdmin but I can't find one. I do not want to have to create a custom controller action as the example I showed is highly simplified and contrived.

I wish that somehow the controller generated by ActiveAdmin would identify type and do Manager.create instead of Employee.create

Does anyone know a workaround?


回答1:


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


来源:https://stackoverflow.com/questions/11497230/how-to-create-an-object-of-a-sti-subclass-using-activeadmin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!