2016-08-07 55 views
0

Ich benutze Ruby on Rails 5 und ich möchte, dass abhängig von der Rolle eines Benutzers der Benutzer 5 Beiträge oder 10 oder 15, und das ist nur ein Teil der verschiedenen möglichen Situationen, die ich überprüfen muss Autorisierung (für Dinge, die keine Posts sind, zum Beispiel habe ich andere Situationen, die etwas komplizierter sind), also habe ich Cancancans (v 1.15.0) vor ein paar Tagen benutzt, um das User-Modell nicht zu groß zu machen, also auf diese Weise Ich habe eine Klasse für jede Rolle und in der Fähigkeit.rb füge ich nur die Klassen abhängig von der Rolle zusammen.Wie kann ich die Autorisierung in Cancan in Ruby on Rails überprüfen, wenn der Benutzer diese Aktion aufruft?

Das Problem ist, dass Cancan anscheinend die Autorisierung nur einmal überprüft. Zum Beispiel in einen Beitrag erstellen, In Beitrag erstellen # die erste Zeile des Codes ist:

authorize! :create, Post 

In der Rollenklasse des Benutzers, ich habe diesen Code:

if user.posts.size < 10 
    Rails.logger.debug "If-size: #{user.posts.size}" 
    can :create, Post 
    else 
    Rails.logger.debug "Else-size: #{user.posts.size}" 
    cannot :create, Post 
    end 

Ich habe einige Tests mit RSpec und ich sehe das erste Mal, dass der current_user (der mit dieser spezifischen Rolle) einen Beitrag mit dem Controller erstellt (ich meine, nicht von FactoryGirl oder eine andere Möglichkeit, die den Controller nicht verwendet), erscheint in log/test.log :

If-size: 0 

Aber weder das Else noch das If erscheint jemals wieder im Log, es spielt keine Rolle wie viele Posts ich vom Controller erstelle, es wertet diese Bedingung erst beim ersten Mal aus und der User bekommt die Berechtigung so viele Posts zu erstellen wie er will Weil die Bedingung in der If zum ersten Mal wahr ist und nicht jedesmal ausgewertet wird, wenn die Methode create des Controllers Post aufgerufen wird.

EDIT: Gelöst mit der von MarsAtomic vorgeschlagenen Methode. Vielen Dank! :)

+0

Hallo Marta und begrüßen Überlauf zu stapeln. Wenn eine Antwort Ihnen geholfen hat, suchen Sie nach dem Häkchen auf der linken Seite und klicken Sie darauf, um anderen zu zeigen, was Ihnen geholfen hat. Denken Sie daran, dass Menschen in Zukunft möglicherweise auf dasselbe Problem stoßen und davon profitieren können, wenn Sie Ihre Frage lesen, anstatt eine neue zu verfassen. – MarsAtomic

Antwort

0

CanCanCan ist nicht dazu gedacht, Rollen basierend auf den Bedingungen in Ihrer Anwendung dynamisch auszuwerten. Diese Art von Funktionalität wird am besten von der eigenen Logik Ihrer Anwendung und nicht von einem Autorisierungswerkzeug gehandhabt.

Sie sollten eine Spalte zu Ihrer roles Tabelle hinzufügen, die angibt, wie viele Beiträge eine bestimmte Rolle erlaubt ist. In dieser Spalte können Sie die Anzahl der Beiträge überprüfen, die jeder Benutzer (über die Rolle) erstellen darf.

Dann in Ihrem posts_controller.rb, können Sie Ihre Post Erzeugungslogik in einem Block wickeln, das nur dann, wenn der Benutzer läuft nicht die maximale Anzahl der Beiträge erlaubt überschritten:

def create 
    if user.posts.size < user.role.max_posts 
    @post = Post.new(post_params) 

    @post.save 
    redirect_to @post 
    else 
    # flash an error on the page or redirect to an error page 
    end 
end