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が、それはセキュリティを低下させ、あまりにもハックです。

ActiveAdmin のいくつかの機能を使用してこれを実行できるようにしたいのですが、見つかりません。私が示した例は非常に単純化され、工夫されているため、カスタム コントローラー アクションを作成する必要はありません。

ActiveAdmin によって生成されたコントローラーが何らかの方法で識別typeして実行することを望みManager.createます。Employee.create

誰かが回避策を知っていますか?

4

2 に答える 2

9

コントローラーを自分でカスタマイズできます。コントローラのカスタマイズに関する ActiveAdmin Docをお読みください。簡単な例を次に示します。

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 に答える