2017-06-13 3 views
1

Ich muss ein Kundenformular ändern, wenn sie bar bezahlt haben (der Administrator). Hypothetisches Geld, kein echtes Geld. Also, um die Form zu ändern, ich habe so etwas wie dies verwendet:Wie kann ich überprüfen, ob der aktuelle Benutzer der Administrator in Schienen ist?

if current_user.user_type == :client 
    show normal form 
elsif current_user.user_type == :admin 
    show normal form + more functionality 
end 

Also, was ist der beste Weg, um den „user_type“ -Funktion zu implementieren? Ich habe darüber nachgedacht, diese Funktion der Benutzerklasse wie unten hinzuzufügen. Die Rückkehr: Verkäufer und Rückkehr: Klient arbeitet normalerweise. Ich habe das getestet. Kann ich die E-Mail und das Passwort des aktuellen Benutzers überprüfen (Der current_user ist ich, mit dem bereits gemachten Passwort und E-Mail)? Das scheint nicht zu funktionieren. Was ist der beste Weg, es zu tun?

class User < ActiveRecord::Base 
    has_one :client 
    has_one :seller 

    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    acts_as_messageable 

    def user_type 
     return :client if self.client(&:info_complete?) 
     return :seller if self.seller(&:info_complete?) 
     return :admin if (self.email == '[email protected]' && self.password == 'admintestpass') 
    end 
end 
+2

Was ich in der Vergangenheit getan haben, ist eine Spalte der Tabelle Benutzer 'role' oder so ähnlich genannt hinzufügen, es dann eine ENUM machen. Rails Enums sind schön zu benutzen. http://api.rubyonrails.org/v5.1.0/classes/ActiveRecord/Enum.html. Der einzige Grund, warum ich zögere, Ihre Lösung zu unterstützen, ist, dass es, wenn die Logik zur Bestimmung von Rollen komplexer wird, sinnvoller wäre, die Rolle zu speichern, als sie jedes Mal zu berechnen. Wenn Sie möchten, dass ich eine Antwort über die Schritte für die Enum-Lösung gebe, lassen Sie es mich wissen –

+0

@ 0101001101000010 Ja bitte !! Würde mein Weg auch alles langsamer machen? weil es jedes Mal rechnen wird? – LizzyTheLearner

+0

Ich denke, die echte Strafe wird später mit Wartbarkeit kommen, nicht so viel Leistung. Im Moment haben Sie eine ziemlich einfache Möglichkeit zu sagen, wer Admin ist, aber was, wenn sich diese Regel ändert? Was passiert, wenn Sie einen anderen Administrator erstellen, dessen E-Mail-Adresse 'me @ random.hotmail.net' lautet? Sie müssten Ihre Regel ändern, und wenn Sie schließlich Dutzende von Admins haben, wird es ein Alptraum sein, eine Regel zu erlassen, die sie alle regelt. Es ist einfacher, Benutzerrollen dauerhaft zu speichern. Ich erstelle normalerweise eine Admin-Seite, auf der Administratoren Benutzerrollen ändern können. Außerdem ist es normalerweise keine gute Idee, ein Benutzerkennwort zu überprüfen. –

Antwort

1

Ok, so müssen Sie zuerst eine Migration erstellen um eine Spalte hinzuzufügen (ich würde nennen es role, nicht type verwenden, weil es Probleme später verursachen wird) an die Benutzertabelle. Ich gehe davon aus, dass Sie wissen, wie man Migrationen schreibt, wenn Sie nicht nach einem Beispiel in den Kommentaren fragen. Die Säule muss vom Typ int sein. null: false, defaul: 0 ist eine gute Idee, um zu vermeiden, dass ein Benutzer keine Rollen hat. Dann kommt das Modell:

Dies ist, wo Schienen enums den Tag retten. Für mein Beispiel sei angenommen, die Säule role

model User < ApplicationRecord #boilerplate stuff 
     enum role: [ :client, :seller, :admin ] # These are the different possible roles 

     def assign_role 
     if # logic to decide role here 
      self.update_attribute(:role, :admin) # This makes the user admin 
     else 
      self.update_attribute(:role, :client) # This makes the user client 
     end 
     end 
    end 

Hinweis gestattet: die assign Rolle Verfahren ist nicht erforderlich, für Aufzählungen ich zu arbeiten, fügte hinzu, es nur so konnte man sehen, wie die Rollen zuweisen und sie Benutzern speichern .

Dann in Ihrem Controller (oder sehen Sie, wenn Sie möchten), können Sie überprüfen, ob ein Benutzer von admin ist:
user.admin? # true if admin, false otherwise

Sie können für alle Rollen die gleiche tun (Dokumentation für eine ausführlichere Erklärung vorgesehen überprüfen): user.client? # true if client, false otherwise user.seller? # true if seller, false otherwise

Letzte Sache im Auge zu behalten, wenn sie Ihre Spalte ein default: 0 hat, das erste Element in der Liste enum wird die Standardrolle sein, in diesem Fall ist es client ist. Sie sollten dies bei der Erstellung neuer Benutzer berücksichtigen.

Und schließlich Dokumentation: http://api.rubyonrails.org/v5.1.0/classes/ActiveRecord/Enum.html

Verwandte Themen