2013-05-23 14 views
7

Ich arbeite mit Rails 4 und Devise 3.0.0 und bin neu bei der Verwendung dieser neuen starken Parameter. Ich habe dem Benutzermodell unter Verwendung der documentation on the Devise wiki einen Benutzernamen hinzugefügt. Das Problem, das ich laufen werde in die starke Parameter in Rails ändern 4.Rails 4 + Devise 3.0.0 Benutzernamen hinzufügen

Wie füge ich das :login Attribut für den Benutzer Modell entweder mit dem Benutzernamen oder E-Mail-Anmeldung zu aktivieren?

+0

nur ein bisschen zu erweitern, würde Ich mag an finde eine Lösung, die ich verwenden könnte, die nicht die Wiederverwendung des 'protected_attributes'-Edelsteins beinhaltete. Wenn das in diesem Fall möglich ist. –

Antwort

10

Von der rails4 readme auf devise: https://github.com/plataformatec/devise/tree/rails4#strong-parameters

class ApplicationController < ActionController::Base 
    before_filter :configure_permitted_parameters, if: :devise_controller? 

    protected 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :email) } 
    end 
end 
+0

Schön! Ich denke, ich hätte die Dokumentation ein wenig genauer lesen sollen. :) Ich fügte hinzu, dass und das schien zu helfen. Jetzt bekomme ich 'undefined Methode' Login 'für Benutzer'. Ich nehme an, ich muss noch etwas anderes für die Anmeldeseite hinzufügen, um das Login-Attribut zu erkennen. –

+0

Oh, Entschuldigung, du hast gesagt, füge dem Modell einen "Benutzernamen" hinzu. replace: login with: Benutzername über –

+0

Das Attribut ': login' wird nur auf der Login-Seite verwendet, um den Benutzernamen oder die E-Mail-Adresse zu speichern, die der Benutzer beim Login eingibt. Ich muss vielleicht nur den Session Controller außer Kraft setzen, damit das funktioniert. –

2

@ justin.chmura

ist hier ein Kern, wie wir am Ende immer daran zu arbeiten.
https://gist.github.com/AJ-Acevedo/6077336

Gist enthält:
app/controllers/application_controller.rb
app/models/user.rb
config/initializers/devise.rb

2

Sie sollten sicherstellen, dass Sie die

umfassen
attr_accessor :login 

im Benutzermodell. Hier ist die Frage, die erklärt, dass attr_accessible veraltet ist.

Rails 4 + Devise Login with email or username and strong parameters

Difference between attr_accessor and attr_accessible

Dies ist, was meine app/models/user.rb Datei aussieht.

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

attr_accessor :login 

    def self.find_first_by_auth_conditions(warden_conditions) 
    conditions = warden_conditions.dup 
    if login = conditions.delete(:login) 
     where(conditions).where(["username = :value OR lower(email) = lower(:value)", { :value => login }]).first 
    else 
     where(conditions).first 
    end 
    end 

    validates :username, 
    :uniqueness => { 
    :case_sensitive => false 
    } 
end 
0

Es wird funktioniert gut, wenn Sie ein Modul in config/initializers als Folgendes mit allen Parametern hinzufügen,

Datei config/initializers/devise_permitted_parameters.rb mit folgendem Inhalt:

module DevisePermittedParameters 
    extend ActiveSupport::Concern 

    included do 
    before_filter :configure_permitted_parameters 
    end 

    protected 

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

end 

DeviseController.send :include, DevisePermittedParameters 
Verwandte Themen