Rails 4 +设计使用电子邮件或用户名和强参数登录

Dra*_*agu 11 ruby-on-rails devise strong-parameters ruby-on-rails-4

我是RoR的新手并且坚持这个设计问题.我想允许用户使用电子邮件或用户名登录(使用用户名注册已经可以).

我按照这些文章: 第1条第2条,您可以看到以下结果:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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>
...
Run Code Online (Sandbox Code Playgroud)

devise.rb

... config.authentication_keys = [:login] ...

结果

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

undefined method `login' for #<User:0x000000033996a0>
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它不起作用,因为我指定"sign_in"允许:登录用户.

rb5*_*512 8

问题是与外地"登录",删除:authentication_keys => [:login]和添加 attr_accessor :login在你的User模型.

  • 非常感谢你,只需添加attr_accessor:login!我认为自从Rails 4以来,"attr_accessor"已经被强大的参数所取代. (2认同)