【问题标题】:Rails 4 + Devise 3.0.0 Adding UsernameRails 4 + Devise 3.0.0 添加用户名
【发布时间】:2013-05-23 13:37:42
【问题描述】:

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

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

【问题讨论】:

  • 只是为了扩展一点,我想找到一个我可以使用的解决方案,它不涉及重用protected_attributes gem。如果在这种情况下是可能的。

标签: ruby-on-rails devise strong-parameters


【解决方案1】:

来自 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

【讨论】:

  • 不错!我想我应该更仔细地阅读文档。 :) 我补充说,这似乎有帮助。现在我收到undefined method 'login' for User。我假设我仍然需要为登录页面添加其他内容以识别登录属性。
  • 哦,对不起,你说给模型添加一个“用户名”。将 :login 替换为 :username
  • :login 属性仅在登录页面上用于保存用户名或用户输入的电子邮件以登录。我可能只需要覆盖会话控制器才能使其正常工作。
  • @justin.chmura 让我知道是否还有其他可以帮助您的事情。否则,请标记为已接受。
  • @AJ。老实说,我只是回到 Rails 3,直到 Rails 4 变得更加充实。我尝试的一切都没有奏效,所以我现在放弃了:)
【解决方案2】:

@justin.chmura

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

要点包含:
应用程序/控制器/application_controller.rb
应用程序/模型/用户.rb
config/initializers/devise.rb

【讨论】:

    【解决方案3】:

    您应该确保包含

    attr_accessor :login
    

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

    Rails 4 + Devise Login with email or username and strong parameters

    Difference between attr_accessor and 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
    

    【讨论】:

      【解决方案4】:

      如果您在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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-06
        • 2014-08-02
        • 2015-04-23
        • 2018-04-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多