2013-08-02 33 views
11

Tôi mới tham gia RoR và bị mắc kẹt với vấn đề này. Tôi muốn cho phép người dùng đăng nhập bằng email HOẶC tên người dùng (đăng ký với tên người dùng đã OK).Rails 4 + Devise Đăng nhập bằng email hoặc tên người dùng và thông số mạnh

Tôi đi theo những bài viết này: Article 1Article 2 và bạn có thể xem kết quả dưới đây:

application_controller.rb

class ApplicationController < ActionController::Base 
    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, :email, :password) } 
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :password, :remember_me) } 
    end 
end 

user.rb

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:login] 

    validates_uniqueness_of :username 
    validates_presence_of :username 
    validates :username, length: { in: 4..20 } 

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

new.html.erb

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

devise.rb

... config.authentication_keys = [: đăng nhập] ...

kết quả

Showing /home/action/workspace/rchq/app/views/devise/sessions/new.html.erb where line #5 raised: 

undefined method `login' for #<User:0x000000033996a0> 

Tôi không hiểu tại sao nó không hoạt động vì Tôi đã chỉ định rằng đối với giấy phép "sign_in": đăng nhập cho Người dùng.

Trả lời

8

Sự cố xảy ra với trường "đăng nhập", xóa :authentication_keys => [:login] và thêm attr_accessor :login vào mẫu User của bạn.

+2

Cảm ơn bạn rất nhiều, nó hoạt động chỉ bằng cách thêm attr_accessor: đăng nhập! Tôi nghĩ rằng "attr_accessor" đã được thay thế bởi các thông số mạnh mẽ kể từ Rails 4. – Dragu

+0

không, attr_accessible không được chấp nhận. dưới đây là thêm: http://stackoverflow.com/questions/3136420/difference-between-attr-accessor-and-attr-accessible – rb512

+0

@Dragu 'attr_accessible' được thay thế bằng các thông số mạnh. 'attr_accessor' tạo ra các phương thức setter/getter, trong trường hợp này là' login'. Nó cũng tạo một biến cá thể của '@ login' – scarver2

Các vấn đề liên quan