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 1 và Article 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.
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
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
@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