1

これまでのところ、この組み合わせたセットアップのほとんどのものは十分に機能します。ただし、条件付きでフィルターを無効にしようとすると、フィルターは常に有効になります。私のシナリオは、(多かれ少なかれ)Restaurant所有者(AdminUserの役割を持つ:restaurateur)に部分的なアクセスを許可したいというものです。所有者は自分のレストランしか編集できず、一部のフィールドも非表示にしたいです。これは機能します。ただし、フィルターを無効にしてもできません。詳細を説明させてください。

# app/admin/restaurants.rb
batch_action :activate, :if => proc { can? :activate, Restaurant } do |list|
  #...
end
controller do
  def current_ability
    @current_ability ||= Ability.new(current_admin_user)
  end
end
index do
  ...
  column :city if can? :manage, Restaurant             # This works well.
end
filter :city, :if => proc { can? :manage, Restaurant } # This is always there.

Ability:_

# app/models/ability.rb
if user.has_role? :admin
  can :manage, :all
elsif user.has_role? :restaurateur
  cannot :manage, Restaurant

Railsコンソールに表示されるものは次のとおりです。

 admin = AdminUser.find(1)                           # roles => [:admin]
 restorateur = AdminUser.find(2)                     # roles => [:restaurateur]
 Ability.new(admin).can?(:manage, Restaurant)        # true
 Ability.new(restorateur).can?(:manage, Restaurant)  # false

:manage一般的な場合、部分的なアクセスを提供することを目的としていない動詞を使用するなど、可能な限り最善の方法で使用していないことを理解しています。ただし、フィルターを無効にすることを除いて、機能します。

これらが実際に機能するように、私がすべき特別なことはありますか?

Rolifyはにあり3.2.0ます。CanCanはにあり1.6.8ます。ActiveAdminはこのGITリビジョンにあります:b0dd8fdcfbd68984a8c2ec7f2279a121eeb66c3d。最新のGITリビジョン(または公式の0.5.0リリース)に更新すると、batch_action常に無効になります!(したがって、それらも無効にselectable_columnします。)

私の質問に:

ActiveAdminのファイル内の能力をテストする信頼できる方法はありますか?おそらく、アビリティがインスタンス化される方法は、間違ったユーザーにフィードします(つまり、フィルター:ifProcをチェックする前に)?can?この場合、ヘルパーがどのようにしてアビリティをインスタンス化するのか、私はほとんど迷っていません。

私の方法が正しくない場合、条件付きでフィルターを無効にする推奨される方法は何ですか?

ActiveAdminの最新バージョンがバッチアクションを完全に無視しているように見える理由を知っている人はいますか?たぶん私はブロックの前にブロックを置くcontroller doべきですbatch_action

御時間ありがとうございます。

4

1 に答える 1

6

私は同じ問題を抱えていて、この問題で解決策を見つけました。

このモンキーパッチを適用した後:

# config/initializers/activeadmin_filter_conditions.rb
module ActiveAdmin
  module Filters
    class FormBuilder < ::ActiveAdmin::FormBuilder
      def filter(method, options = {})
        return "" if method.blank?
        if options[:if].is_a?(Proc)
          return "" if !template.instance_eval(&options[:if])
        end
        options[:as] ||= default_input_type(method)
        return "" unless options[:as]
        content = input(method, options)
        form_buffers.last << content.html_safe if content
      end
    end
  end
end

あなたが述べた方法を使用して、フィルターで条件を使用できるはずです:

filter :city, :if => proc { can? :manage, Restaurant }
于 2012-09-17T10:34:57.007 に答える