4

次のようなアクティブな管理リソースがあります。

ActiveAdmin.register Snippet do

  menu label: "Text Snippets"

  config.clear_sidebar_sections!

  index download_links: false do
    column :key if current_admin_user.developer?
    column :description
    column :contents
    default_actions
  end

  form do |f|
    f.inputs do
      f.input :description
      f.input :contents
    end
    f.buttons
  end

end

indexブロック内でkey、現在の管理者ユーザーが開発者である場合にのみ列を追加していることに注意してください。この種のフィルタリングを利用可能なアクションに適用したいと考えています。

これをリソース定義の先頭に追加してみました:

actions current_admin_user.developer ? :all : :index, :edit

しかし、私はNameError上に行きcurrent_admin_userます。何らかの理由で、構成ブロックの外に、アクティブな管理current_admin_userヘルパーが存在しません。

では、現在のユーザーの権限に基づいてアクションをフィルタリングするにはどうすればよいでしょうか?

4

1 に答える 1

9

プロシージャを使用する必要があります... current_admin_user は、クラスを宣言するときではなく、アプリが実行されているときにのみ機能します..

例..

action_item :only => [:edit], :if => proc { current_admin_user.developer? } do
  #enter code here
end

これに CanCan を使用することもできます..そしてcontroller.authorize_resource先頭に配置します。これについては、activeadmin のドキュメントを確認してください。

それを行う別の方法は、ActiveAdminコントローラーでaction_methodsをオーバーライドすることです..このように

actions :all

controller do
  def action_methods
    if current_admin_user.developer?
      super
    else
      super - ['show', 'destroy', 'new', 'create']
    end
  end
end

複数の役割がある場合、これはうまく機能します。

developer?ところで、代わりに使用する必要がありますdeveloper(もちろん、私が推測するようにdeveloperメソッドがブール値を返す場合)

アップデート

バージョン 0.6 以降では、CanCan を使用する必要があります。詳細については、activeadmin のドキュメントhttp://www.activeadmin.info/docs/13-authorization-adapter.html#using_the_cancan_adapterを確認してください。

于 2012-07-31T17:18:52.943 に答える