2016-04-18 7 views
0

Ich benutze Pandit für die Autorisierung in einer App Schienen. Für einige Modelle möchte ich eine Berechtigung auf Attributebene haben. Zum Beispiel kann ein normaler Benutzer seine Telefonnummer ändern, aber seinen Status nicht auf "Administrator" setzen.Berechtigung auf Attributebene in Ansichten mit Pandit

Wie in empfohlen, verwende ich die permitted_attributes für diese.

Ich möchte nun auf diese Attribute in einer Ansicht zugreifen, um zu entscheiden, welche Felder in einem Formular angezeigt oder aktiviert werden sollen. Gibt es einen (eleganten) Weg, dies zu tun, ohne die autorisierten Felder dort im Wesentlichen zu wiederholen?

Antwort

2

Zuerst können Sie ein paar schöne Abkürzungen in Ihrem ApplicationPolicy hinzufügen möchten, die Sie überprüfen können, ob Attribute zulässig:

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 

Sie könnten dann ein benutzerdefiniertes Formular-Builder (oder ein Modul, das eine Formular-Builder erweitert) erstellen :

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 %> 

können Sie auch Schienen konfigurieren Sie Ihre individuelle verwenden fo rm Builder standardmäßig:

ActionView::Base.default_form_builder = MyFormBuilder 

See:

+0

Dank, habe ich die Methoden zur Anwendungsrichtlinie und erstellt das benutzerdefinierte Formular-Builder, aber ich kann nicht für den Zugriff scheinen die Richtlinie vom Helfer. Ich erhalte eine "Methode der undefinierten Methode" für # " – bmesuere

+0

Haben Sie versucht, @ template.policy aufzurufen? Ich stelle fest, dass ich einen Tippfehler gemacht habe und habe es mit einem Leerzeichen geschrieben. @template ist eine Verknüpfung zum Ansichtskontext, der die Richtlinie enthalten sollte - nicht die Form Builder-Klasse. – max

+0

Ja, ich habe sowohl @ template.policy als auch view_context.policy ausprobiert. In der Ansicht selbst kann ich ohne Probleme auf Richtlinien zugreifen. – bmesuere