2010-09-11 10 views

Antwort

-2

einfach einen Benutzernamen Feld zu Ihrem User-Modell hinzufügen und auf der Devise wiki: http://github.com/plataformatec/devise/wiki/Sign-in-using-login-or-mail

Hoffe, es hilft.

+4

Diese Verbindung unterbrochen ist, zu verstehen. Vielleicht könnten Sie das nächste Mal die notwendigen Informationen in Ihre Antwort eintragen? – Benson

+1

Der Link verweist jetzt auf die oberste Ebene des Devise-Wikis. Da ich nicht wusste, dass das Wiki dort war, fand ich den Link hilfreich. Wahrscheinlich ist die spezifische Antwort jetzt https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-sign_in-user-user-username-oder-email-address, obwohl wie lashleigh sagt, Dieser Artikel adressiert _validating_ den Benutzernamen im Modell nicht. –

+0

In Rails 4 funktioniert das einfach nicht mehr. Es ist nicht mehr einfach. – CarlosCervantes

-7

Wie Devise anpassen ... Alles ist hier: http://railscasts.com/episodes/210-customizing-devise

+7

Korrekturlesen ist ein Muss, IMO. Außerdem, wenn die notwendigen Informationen da sind, könntest du es hier bereit stellen, wie bei Laschleigh. RTFM ist keine Antwort. – Benson

+1

Ein direkter Link zu einem genauen, relevanten "Handbuch" (in diesem Fall ein Screencast) von einer angesehenen Quelle ist hilfreich. –

+1

Dieses Problem wurde in dem in dieser Antwort erwähnten Screencast nicht behandelt. –

18

ich verwendet, um sowohl die von den genannten Tutorials in den anderen Antworten, Railscast #210 und der Devise Wiki. Soweit ich das beurteilen konnte, sagen sie jedoch nicht explizit, wie das Vorhandensein und/oder die Eindeutigkeit des Feldes "Benutzername" überprüft werden soll.

Wenn Sie hinzugefügt Benutzernamen mit einer einfachen Migration -

rails generate migration addUsernameToUser username:string 

Dann entwickeln sich nichts Besonderes tun mit diesem Bereich, so dass Sie prüft, ob die Validierung hinzufügen müssen und Einzigartigkeit sich im User-Modell.

class User < ActiveRecord::Base 
... 
    validates_presence_of :username 
    validates_uniqueness_of :username 

Wenn Sie jedoch auf der # 209 aussehen Railscast ist ein Beispiel für die Migration verwendet, um das User-Modell zu erstellen.

class DeviseCreateUsers < ActiveRecord::Migration 
    def self.up 
    create_table(:users) do |t| 
     t.database_authenticatable :null => false 
     # t.confirmable 
     t.recoverable 
     t.rememberable 
     t.trackable 
     # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both 

     t.timestamps 
    end 

    add_index :users, :email,    :unique => true 
    # add_index :users, :confirmation_token, :unique => true 
    add_index :users, :reset_password_token, :unique => true 
    # add_index :users, :unlock_token,   :unique => true 
    end 

    def self.down 
    drop_table :users 
    end 
end 

Hinweis hier, dass die Benutzer E-Mail als einzigartig definiert ist. Vielleicht würde, wenn der Benutzername unter Verwendung derselben Syntax hinzugefügt würde, Devise Magic für Präsenz und Einzigartigkeit sorgen.

+0

Ich tat, wie Sie sagten validates_presence_of: Benutzername und validates_uniqueness_of: Benutzername in meinem "Benutzer" -Modell, wie würde ich machen, wenn der Fehler auftritt, der "Name Fehler" der erste auf der Liste sein, von Fehlern, wenn sie angezeigt werden ? –

14

Rails 4 und Strong Parameter

Auf dem oben hatte ich mit den Ansichten zu generieren:

$ rails g devise:views 

dann in devise.rb add:

config.scoped_views = true 

und schließlich konfigurieren die zulässigen Parameter wie unten für sign_up wie folgt:

class ApplicationController < ActionController::Base 

    before_filter :configure_permitted_parameters, if: :devise_controller? 

    protected 

    def configure_permitted_parameters 
     devise_parameter_sanitizer.for(:sign_up) do |u| 
     u.permit :username, :email, :password, :password_confirmation 
     end 
    end 
end 

This is described in Devise Doc

Auch ist meine Validierung für username folgende:

validates :username, presence: true 
validates :username, uniqueness: true, if: -> { self.username.present? } 

ich zwei Linien, also wenn username leer bekomme ich nur einen Fehler.

+0

Wie würden Sie diese neuen Parameter beibehalten, wenn die Validierung fehlschlägt? Derzeit wird nur die E-Mail-Adresse beibehalten. – Dexter

+0

ähm ... Ich kann jetzt nicht überprüfen, aber ich würde zuerst den Controller einchecken und sicherstellen, dass ein '@ user' Objekt mit diesen Werten zurückgegeben wird. Vielleicht ist die E-Mail das einzige Feld, das aufgezeichnet wurde, weil das Objekt leer ist und der Browser es ausfüllt. Einfach nur von den Hüften aus – ecoologic

+0

überprüfen, ob die Vorlage in der gleichen Aktion gerendert wird und es keine Umleitung gibt, in diesem Fall wieder die '@ user' ist leer. Wenn Sie die Ansichten überschrieben haben, überprüfen Sie in der Ansicht, dass die Werte vorhanden sind. – ecoologic

Verwandte Themen