2017-11-18 1 views
0

In meinem Projekt habe ich ein Benutzermodell und ein Werbemodell. Das Benutzermodell enthält auch die Admins. Ich möchte Routen so einrichten, dass bei der Anmeldung eines Administrators alle URLs "/ admin" enthalten. Ich bin neu in Schienen und habe Probleme mit dem gleichen. Wenn sich beispielsweise ein regulärer Benutzer anmeldet, lautet die URL/advertisements /: id/show, aber wenn sich ein Administrator anmeldet, wird die URL zu/admin/advertisements /: id/show. Ich habe viele Methoden ausprobiert, konnte aber keine Lösung finden. Meine Benutzermigrationsdatei wird wie folgt:Schienen Hinzufügen/Admin zu Routen, wenn der Administrator sich anmeldet

class CreateUsers < ActiveRecord::Migration[5.1] 

def change create_table :users do |t| t.string :first_name, limit: 15, null: false t.string :last_name, limit: 15 t.string :username, limit: 20 t.string :email, null: false t.string :password_digest t.boolean :approved, default: false t.boolean :admin, default: false t.timestamps end end end

Meine Anzeigen Migrationsdatei ist:

class CreateAdvertisements < ActiveRecord::Migration[5.1] 
    def change 
    create_table :advertisements do |t| 
     t.string :name, null: false 
     t.text :description, null: false 
     t.integer :price, null: false 
     t.string :location, null: false 
     t.integer :user_id 
     t.boolean :approved, default: false 
     t.timestamps 
    end 
    add_index("advertisements", "user_id") 
    end 
end 

die Routen-Datei (routes.rb) hat den Code

resources: users 
resources: advertisements 

Gibt es eine Möglichkeit, es zu tun?

+0

Haben Sie getrennte Wege zu separaten Controller führen oder wollen Sie gleichen Controller mit verschiedenen Routen zugänglich sein wollen? – AntonTkachov

+0

Ich möchte, dass die gleichen Controller über separate Routen erreichbar sind, so wie die Werbung sowohl vom Administrator als auch vom Benutzer, der sie veröffentlicht hat, gelöscht werden muss. –

+0

Auf der einen Seite ja ... aber auf der anderen Seite sollte Benutzer Zugriff nur auf seine eigenen Beiträge haben, während Admin - auf alle Beiträge. Ich gehe normalerweise mit 2 Varianten: 1. Entweder separaten Admin-Panel-Namespace oder 2. Verwenden Sie die gleichen Routen, aber verstecken Sie einfach Admin-Logik für keine Admin-Benutzer. Was sind deine Gründe, 2 Routen für 1 Controller zu haben? Admin/None Admin-Rollen können problemlos auf einer Route behandelt werden – AntonTkachov

Antwort

0

Um solche Routen definieren Sie können Sie mit:

resources: advertisements 

scope :admin 
    resources: advertisements 
end 

Dann Setup eine Art Filter, das Benutzer zwingen, wird /advertisements Link und Kraft admin Benutzer /admin/advertisements in advertisements_controller zu verwenden:

before_action :require_proper_route_for_role, only: [:index, :new, :show, :edit] 

private 
def require_proper_route_for_role 
    request_params = "?#{params.to_query}" 
    if user.admin? && request.path !~ /^\/admin/ 
    redirect_to "/admin#{request.path}#{request_params}" 
    elsif request.path =~ /^\/admin/ && !user.admin? 
    redirect_to "#{request.path.sub('/admin','')}#{request_params}" 
    end 
end 

Dieser Code ist überhaupt nicht perfekt, aber es ist das Beste, was ich in begrenzter Zeit tun könnte ... aber, wie ich schon sagte, ich denke, Sie machen ein paar falsche Dinge, die im Allgemeinen neu gedacht werden sollten

+0

Danke für die Hilfe. Außer den URLs, bei denen Parameter zusammen mit der URL gesendet werden, funktioniert das wunderbar. –

+0

Ja, Sie haben Recht. Ich habe es nicht berücksichtigt. Aber es wird ziemlich schwierig sein, all das in create/update/destroy zu handhaben. Sie können nicht umleiten für POST/PUT/DELETE – AntonTkachov

+0

So ist es wieder eine Frage, warum brauchen Sie so unterschiedliche Routen für die gleiche Logik? – AntonTkachov

0

Nur ein Schnitt zu AntonTkachovs Antwort. Der Code ist bei einigen Teilen fehlgeschlagen, da request.path die Parameter löscht und nur den relativen Pfad erhält, die Parameter gingen verloren. Auch die Methoden "Post", "Patch" und "Put" wurden in "Get" -Methoden geändert, die das Erstellen und Aktualisieren neuer Werbeanzeigen blockierten. Ein paar kleine Änderung erlaubte mir, das Problem zu beheben, die wie folgt lauten:

before_action: :require_proper_route_for_role, except: [:create, :update] 

private 

def require_proper_route_for_role 
    url_path = request.url 
    params_path = url_path.split('?').last 
    if current_user.admin? && request.path !~ /^\/admin/ 
    if params_path == url_path 
     redirect_to "/admin#{request.path}" 
    else 
     redirect_to "/admin#{request.path}?#{params_path}" 
    end 
    elsif request.path =~ /^\/admin/ && !current_user.admin? 
    redirect_to "#{request.path.sub('/admin','')}" 
    end 
end 
Verwandte Themen