2016-04-18 13 views
0

私はレールアプリの認定に専門家を使用しています。一部のモデルでは、属性レベルの承認が必要です。たとえば、通常のユーザーは電話番号を変更することはできますが、ステータスを「管理者」に設定することはできません。評価のあるビューでの属性レベルの認可

the Pundit docsでお勧めするように、私はこれにpermitted_attributesを使用しています。

フォームで表示または有効にするフィールドを決定するビューで、これらの属性にアクセスする必要があります。基本的に認可されたフィールドを繰り返さずにこれを行う(エレガントな)方法はありますか?属性が許可されている場合

答えて

2

まずあなたがチェックすることができますあなたのApplicationPolicyにいくつかの素晴らしいショートカットを追加することもできます。

class ApplicationPolicy 
    #... 

    def permits_attributes?(*attrs) 
    attrs.keep_if({|a| permits_attribute?(a) }).any? 
    end 

    def permits_attribute?(attr) 
    permitted_attributes.include?(attr) 
    end 

    # ... 
end 

次に、(フォームビルダを拡張またはモジュール)カスタムフォームビルダを作成することができます:

class MyFormBuilder < ActionView::Helpers::FormBuilder 
    def can_fill_in?(attr) 
    yeild if @template.policy(object).permits_attribute?(attr) 
    end 
end 

<%= form_for(@project, builder: MyFormBuilder) do |f| %> 
    <%= f.can_fill_in?(:title) do %> 
    <%= f.label :title %> 
    <%= f.text_field :title %> 
    <% end %> 
<% end %> 

また、カスタムFOを使用するようにレールを構成することができます

ActionView::Base.default_form_builder = MyFormBuilder 

参照:デフォルトでは、RMビルダー

+0

おかげで、私は、アプリケーションポリシーにメソッドを追加し、カスタムフォームビルダを作成したが、私はアクセスできないようですヘルパーからのポリシー。 # "のための"未定義のメソッド 'ポリシー"を取得しました – bmesuere

+0

@ template.policyを呼び出そうとしましたか?私はタイプミスをしてスペースで書きました。 @templateは、フォームビルダークラスではなく、ポリシーを持つビューコンテキストへのリンクです。 – max

+0

はい、@ template.policyとview_context.policyの両方を試しました。ビュー自体では問題なくポリシーにアクセスできます。 – bmesuere

関連する問題