2013-08-01 6 views
5

Używam Rails 4.0 i Devise 3.0.0.rc.Logowanie przy użyciu nazwy użytkownika przy użyciu narzędzia Wymuś z Railsami 4

Zainstalowałem Devise z jego domyślnymi ustawieniami - tzn. Zarejestruj się/używając swojego adresu e-mail. Chciałbym jednak, aby użytkownicy mogli rejestrować się przy użyciu nazwy użytkownika zamiast adresu e-mail. Śledziłem railscasty pod kątem parametrów, które można zmienić, oraz wszelkich porad, które mogę znaleźć na temat rzeczy, które mogą być potrzebne do zmiany Rails 4. Jednak zawsze, gdy próbuję stworzyć nowego użytkownika, otrzymuję komunikat o błędzie " e-mail nie może być pusty ". Czy ktoś ma pomysł, co jest przyczyną tego i jak mogę to naprawić? Dzięki!!

Kod:

kontroler aplikacji:

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 
    before_filter :configure_permitted_parameters, if: :devise_controller? 

    protected 

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

Zaloguj się (Sign up formularza jest prawie taka sama):

<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> 
    <div><%= f.label :username %><br /> 
    <%= f.text_field :username, :autofocus => true %></div> 

W devise.rb config:

config.authentication_keys = [ :username ] 

użytkowników cont Rolka:

private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_user 
     @user = User.find(params[:id]) 
    end 

# Never trust parameters from the scary internet, only allow the white list through. 
def user_params 
    params.require(:user).permit(:first_name, :middle_names, :last_name, :date_of_birth, :gender, :line_1, :line_2, :line_3, :town, :county, :postcode, :contact_number, :email, :username, :password, :password_confirmation, :remember_me) 
end 

user.rb:

protected 

    def self.find_for_database_authentication(warden_conditions) 
    conditions = warden_conditions.dup 
    login = conditions.delete(:login) 
    where(conditions).where(["lower(username) = :value", { :value => login.downcase }]).first 
    end 

Odpowiedz

4

Usuń validatable z User modelu devise sekcji - opcja ta sprawdza obecność, wyjątkowość i format adresu e-mail. Będziesz musiał ręcznie dodać własne sprawdzenia poprawności dotyczące obecności, potwierdzenia i długości hasła.

+0

To działało świetnie, dziękuję. Nie mogę uwierzyć, że tęskniłem za tym! Być może Devise powinien dodać opcję zmiany wszystkich walidacji na typowe opcje, takie jak nazwa użytkownika, a nie tylko e-mail ...? – ecs

+3

Może nie być potrzebny. Nadal można korzystać z modułu sprawdzania poprawności i po prostu wyłączyć wymaganie obecności e-mail, definiując metodę "def email_required"? false 'w twojej klasie użytkownika. – eugen

+0

Dzięki, próbuję naprawić to przez wiele godzin i to działa. – Michael