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! :)
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