2017-10-03 4 views
0

Ich benutze devise, und bis jetzt habe ich nur die devise Controller zusammen mit den Ansichten für drei Benutzer (user1, user2, admin) hinzugefügt. Ich habe keine before_action :authenticate_user! in einem Controller. Grundsätzlich habe ich bis jetzt this gemacht.
So können sich derzeit alle registrierten Benutzer einloggen und alle Inhalte ansehen/bearbeiten. An dieser Stelle möchte ich jeden Benutzer darauf beschränken, nur seine Inhalte anzuzeigen oder zu bearbeiten.Rails: Erlaubt Benutzern nur ihre eigenen Inhalte zu sehen oder zu bearbeiten

Das ist im Grunde, was ich habe: Der Admin wird Zugriff auf alle der App haben. Benutzer1 hat Zugriff auf get 'books/search' => 'books#search', as: 'search_books' und damit root 'books#search'. Und Benutzer2 wäre in der Lage, ein Buch über die `Ressourcen: Bücher hinzuzufügen/zu löschen/zu bearbeiten und auch sein aktuelles Konto anzuzeigen.

Nicht sicher, welchen Zugriff ich die resources :plans, resources :accounts, resources :transactions geben sollte. Pläne sind, Pläne zusammen mit den Transaktionen zu kaufen, und Konten gehören zu Benutzer2. Sie können die folgenden Assoziationen sehen.

Ich habe ein wenig Nachforschung darüber und fand ein paar gems, CanCan, rolify, die den Benutzern Rollen hinzufügen.

Gibt es eine andere Möglichkeit, die Rollen mit devise zu implementieren?

Rails.application.routes.draw do 

    root 'books#search' 

    get 'books/search' => 'books#search', as: 'search_books' 
    get "/cancel_subscription", to: "accounts#cancel_subscription", as: "cancel_subscription" 

    devise_for :admins, controllers: {registrations: 'admins/registrations', sessions: 'admins/sessions'}, :class_name => 'Admin' do 
    get "admins/dashboard"=> "admins/sessions#dashboard", :as => "admin_dashboard" 
    end 

    devise_for :users1, controllers: {registrations: 'users1/registrations', sessions: 'users2/sessions'} 
devise_for :users2, controllers: {registrations: 'users2/registrations', sessions: 'users2/sessions'} 

resources :books do 
    resources :comments 
end 
resources :categories 
resources :plans 
resources :accounts 
resources :transactions, only: [:new, :index, :create] 
end 

class Comment < ApplicationRecord 
    belongs_to :book 
    belongs_to :user1 
end 

class Books < ApplicationRecord 
    has_many :comments 
end 

class User1 < ApplicationRecord 
    devise :database_authenticatable, :registerable, 
:recoverable, :rememberable, :trackable, :validatable 

    has_many :comments 
end 

class User2 < ApplicationRecord 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    has_one :account, autosave: true 
    has_many :books 

    accepts_nested_attributes_for :account 
end 

class Admin < ApplicationRecord 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 
end 
+2

Sie klingen verwirrt über das, was Sie hier erreichen möchten .... Wenn Sie nur die Fähigkeit hinzufügen möchten, Benutzer als 'admin' zu markieren, dann fügen Sie einfach eine' is_admin' boolesche Spalte hinzu Benutzertisch? Wenn Sie Probleme beim Einrichten der Controller-/Permitter-Logik haben, geben Sie bitte ** Ihren Code ** an, damit wir das Problem diagnostizieren können. –

+0

Sie sollten Pandit gem. => https://github.com/elabs/pundit <= es ist genau das, was du brauchst. –

+0

Können Sie näher erläutern, wie Sie die Unterstützung für mehrere Benutzer implementiert haben? Wie sind Nutzer und deren Inhalte verbunden, wie sind die Assoziationen definiert? – spickermann

Antwort

0

Was können Sie tun, ist für die Art der Klasse des aktuellen mit

if current_user.class.eql?(class_name_of_user) #perform some action end Sie es, indem sie dies eine private Methode in Ihrem Controller verfeinern zu überprüfen und durch einen before_action Rückruf aufrufen.

Verwandte Themen