7

我正在使用 Rails 4 和 Devise 3.0.0,并且不熟悉使用这些新的强大参数。我使用Devise wiki 上的文档向 User 模型添加了用户名。我遇到的问题是 Rails 4 中的强大参数变化。

如何将:login属性添加到用户模型以启用使用用户名或电子邮件登录?

4

4 回答 4

10

从关于设计的 rails4 自述文件:https ://github.com/plataformatec/devise/tree/rails4#strong-parameters

class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :email) }
  end
end
于 2013-05-23T15:01:34.610 回答
2

@justin.chmura

这是我们最终如何使其工作的要点。
https://gist.github.com/AJ-Acevedo/6077336

要点包含:
app/controllers/application_controller.rb
app/models/user.rb
config/initializers/devise.rb

于 2013-07-25T06:29:36.687 回答
2

你应该确保你包括

attr_accessor :login

在用户模型中。这是我发现解释 attr_accessible 已弃用的问题的地方。

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

attr_accessor 和 attr_accessible 的区别

这就是我的app/models/user.rb文件的样子。

class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

attr_accessor :login

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

  validates :username,
  :uniqueness => {
    :case_sensitive => false
  }
end
于 2013-11-22T03:38:47.243 回答
0

config/initializers如果您添加一个带有所有参数的模块,它将正常工作,

文件config/initializers/devise_permitted_parameters.rb内容如下:

module DevisePermittedParameters
  extend ActiveSupport::Concern

  included do
    before_filter :configure_permitted_parameters
  end

  protected

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

end

DeviseController.send :include, DevisePermittedParameters
于 2015-04-01T10:00:58.903 回答