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

11 浏览
0 Comments

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

我对RoR还不熟悉,遇到了这个devise的问题。\n我想允许用户使用电子邮件或用户名登录(用户名注册已经可以了)。\n我按照以下文章进行操作:\n文章1文章2,你可以在下方看到结果:\n

application_controller.rb

\n

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

\n

user.rb

\n

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

\n

new.html.erb

\n

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

\n

devise.rb

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

result

\n

显示 /home/action/workspace/rchq/app/views/devise/sessions/new.html.erb,第5行引发错误:
undefined method `login' for #

\n我不明白为什么它不工作,因为我已经指定了对于User的\"sign_in\"允许 :login。

0
0 Comments

问题出现的原因是在"login"字段上,解决方法是在User模型中删除:authentication_keys => [:login]并添加attr_accessor :login

非常感谢,只需添加attr_accessor :login就可以解决问题!我以为在Rails 4中已经用strong parameters取代了"attr_accessor"。

不是的,attr_accessible已经被弃用了。这里有更多关于它的信息:stackoverflow.com/questions/3136420/…

attr_accessible被strong parameters取代了。attr_accessor创建setter/getter方法,在这种情况下创建了login的实例变量。

0