2016-06-29 5 views
0

Ich möchte korrekte Benutzer, Administratoren und Redakteure in der Lage sein, ein Blog zu bearbeiten, zu aktualisieren und zu löschen.Rails Autoreditor und korrekter Benutzer

Ich habe dies in meinem Blogs Controller:

before_action :require_user, only: [:new, :create, :edit, :update, :destroy] 
before_action :correct_user, only: [:edit, :update, :destroy, :can_edit_blog?] 

und in dieser unter privat:

def can_edit_blog? 
     true if ((current_user.admin? || current_user.editor?) || correct_user) 
    end 

    def correct_user 
     @blog = current_user.blogs.find_by(id: params[:id]) 
     redirect_to root_url if @blog.nil? 
    end 

Gerade jetzt nur den richtigen Benutzer erlaubt, aber nicht die Admin oder Editoren. Ich habe versucht, eine andere before_action zu verwenden: admin_user, aber das schien nicht zu funktionieren.

Antwort

0

Ich habe eine App, die eine ähnliche Logik hat. Hier ist, wie mein Controller-Code aussehen würde. Einige der privaten Methoden können für den ApplicationController abstrahiert werden.

before_action :require_user, only: [:new, :create, :edit, :update, :destroy] 
before_action :require_creator, only: [:edit, :update, :destroy] 

private 

    def require_user 
    access_denied unless logged_in? 
    end 

    def logged_in? 
    !!current_user 
    end 

    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 

    def access_denied 
    redirect_to root_path 
    end 

    def require_creator 
    access_denied unless logged_in? and (current_user == @blog.user || current_user.admin?) 
    end 
+0

ich es ein wenig verändert und es funktionierte! Vielen Dank! – user1636937

0

Sie wollen nicht can_edit_blog in der :only Möglichkeit, die before_action Aufruf correct_user nennen. Sie wollen can_edit_blog? in correct_user nennen:

before_action :correct_user?, only: [:edit, :update, :delete] 

... 

private 

    def can_edit_blog? 
    current_user.admin? || current_user.editor? 
    end 

    def correct_user 
    @blog = current_user.blogs.find_by(id: params[:id]) 
    if @blog.nil? or not can_edit_blog? 
     redirect_to root_url 
    end 
    end 

OP-Lösung richtig ist, mir ist nicht, beziehen sich auf die aktualisierte Frage

+0

Ich habe das gerade versucht und meinem Administrator wurde keine Erlaubnis erteilt ... Ich habe Ihren Vorschlag geändert von: correct_user? an: correct_user, weil ich keine Methode correct_user hatte? – user1636937

+0

Sind Sie sicher, dass Ihre 'admin?' Methode dann funktioniert? Oder ist Ihr Benutzer wirklich als 'admin?' Definiert? Wenn du 'byebug' in deiner Gemfile verwendest, kannst du bitte die folgende Zeile einfügen: 'debugger' in den Anfang von' can_edit_blog? 'Und gehe dann zu deiner Konsole, gib 'current_user.admin?' In die byebug Konsoleneingabe ein, Enter drücken und sehen, ob es wahr oder falsch zurückgibt? –

+1

es kehrt wahr ... durch Logik sollte es funktionieren. Ich habe gerade mit deinem Vorschlag gebastelt und es funktioniert jetzt. Danke für die Hilfe! – user1636937

1
before_action :require_creator, only: [:edit, :update, :destroy] 

    ... 

    def can_edit_blog? 
     current_user.admin? || current_user.editor? 
    end 

    def require_creator 
     @blog = Blog.find(params[:id]) 
     redirect_to root_url unless (current_user == @blog.user || can_edit_blog?) 
    end 
Verwandte Themen