2016-07-18 19 views
0

Ich versuche herauszufinden, wie man Pandits Berechtigungen in meiner Rails 4 App schreiben.Rails - Pundit mit Scopes

Ich habe ein Artikelmodell mit einer Artikelrichtlinie. Der Artikel Politik:

class ArticlePolicy < ApplicationPolicy 
    attr_reader :user, :scope 

    def initialize(user, record, scope) 
     @scope = scope 
     super(user, record) 
    end 

    class Scope < Scope   
     def resolve 
     if user == article.user 
      scope.where(user_id: user_id) 
     elsif approval_required? 
      scope.where(article.state_machine.in_state?(:review)).(user.has_role?(:org_approver)) 
     else 
      article.state_machine.in_state?(:publish) 
     end 
     end 
    end 

    # TO DO - check if this is correct - I'm not sure. 
    # I now think I don't need the index actions because I have changed the action in the articles controller to look for policy scope. 
    # def index? 
    # article.state_machine.in_state?(:publish) 
    # end 

    def article 
     record 
    end 

Der Artikel Controller hat:

def index 
    @articles = policy_scope(Article) 
    # query = params[:query].presence || "*" 
    # @articles = Article.search(query) 
end 

Ich folge den Pandit Dokumente Bereiche beziehen und versuchen, herauszufinden, warum die Aktion Index in den politischen Dokumenten dargestellt ist nicht für mich arbeiten. Ich habe folgendes versucht (wie in der Dokumentation gezeigt):

<% policy_scope(@user.articles).sort_by(&:created_at).in_groups_of(2) do |group| %> 

aber ich bekomme diese Fehlermeldung:

undefined local variable or method `article' for #<ArticlePolicy::Scope:0x007fff08ae9f48> 

Kann jemand sehen, wo ich falsch gegangen?

Ich bin mir nicht sicher, ob @ user.articles richtig ist. In meinem Konstrukt gehören Artikel zu Benutzern, aber in meiner Indexaktion möchte ich jedem Benutzer die Artikel zeigen, die meine Bereiche ihnen anzeigen lassen.

Antwort

0

Sie können dies in Ihrer Aktion im Controller versuchen.

@articles = policy_scope(Article).all 

Es wird alle Artikel erhalten. Wenn Sie die Artikel basierend auf Suchparametern abrufen möchten, können Sie dies versuchen.

@q = policy_scope(Article).search(params[:query]) 
@articles = @q.result 
+0

@Blal - danke für den Vorschlag. Ich habe das versucht, aber ich bekomme immer noch dieselbe Fehlermeldung wie oben. – Mel

+0

Können Sie überprüfen, ob die Datensatzvariable den jeweiligen Artikel enthält? Ich denke, es sollte die Artikelaufzeichnung enthalten. –

+0

Hallo @Bllal - Es tut mir leid, aber ich weiß nicht, was das bedeutet. – Mel

0

Ich glaube, Sie ausdrücklich Artikel als Accessor in der Scope-Klasse festgelegt müssen, wie der Fehler zeigt an, dass es nicht ‚Artikel‘ nicht erkennt. Versuchen Sie etwas wie

attr_accessor :article 

setzen Sie es in einer Initialisierungsmethode, und Sie können wahrscheinlich mit der Artikelmethode.

def initialize(record) 
    @article = record 
end 
+0

Hallo @margo danke für den Vorschlag. Ich habe das versucht, aber ich bekomme immer noch die gleiche Fehlermeldung, wie ich oben gezeigt habe. – Mel