Ruby on rails 设计-通过电话号码或电子邮件登录

Ruby on rails 设计-通过电话号码或电子邮件登录,ruby-on-rails,ruby,authentication,devise,Ruby On Rails,Ruby,Authentication,Devise,我需要使用电话号码或电子邮件地址登录到应用程序。我正在使用Desive 3.5.2进行身份验证。根据这篇文章(),我实现了以下内容 应用程序\u controller.rb before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters added_attrs = [:phone, :email, :password,

我需要使用电话号码或电子邮件地址登录到应用程序。我正在使用Desive 3.5.2进行身份验证。根据这篇文章(),我实现了以下内容

应用程序\u controller.rb

before_action :configure_permitted_parameters, if: :devise_controller?

protected

def configure_permitted_parameters
    added_attrs = [:phone, :email, :password, :password_confirmation, :remember_me]
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(added_attrs) }
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(added_attrs) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(added_attrs) }
end
user.rb

attr_accessor :email_confirmation, :login

devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:login]

  def login=(login)
    @login = self.email
  end

  def login
    @login || self.phone || self.email
  end
config/initializers/designe.rb

config.authentication_keys = [ :login ]
现在,如果我尝试使用电子邮件或电话号码登录,我会收到一个“未经授权”的错误。下面是一个示例请求

Processing by Devise::SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"hCUuF5Ja9f37I4ZBSafGvCpgTnF1nKWf+q8aTEv28mW6vx3z+hIietmYjX9vi0/l/bjVqj0jDaV88mvmdXn9Vg==", "user"=>{"email"=>"jen@companyadmin.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}

 Processing by Devise::SessionsController#create as HTML
 Parameters: {"utf8"=>"✓", "authenticity_token"=>"uRnINI6Bogx3yeAP8WNpZB31jNOWnvvWVhHJg1BMZL2Hg/vQ5sl1i1Vy6zHXT+A9yi0XCN4hU+zQTLgpbsNrjg==", "user"=>{"email"=>"1234567890", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
对于这两个请求,响应都是

Completed 401 Unauthorized in 2ms

你知道如何解决这个问题吗?

通过你共享的参数,电话或电子邮件将被发送到名为param的
电子邮件。相反,它应该是
login

如果您的视图接受电子邮件或电话号码的代码为

<%= f.text_field :email %>
<%= f.text_field :phone %>

然后将其替换为

<%= f.text_field :login %>


这样,发送的参数将是登录,其余将由您的代码处理。如果这仍然给您错误,请告诉我。参考除了使用用户名之外,它实现了相同的功能。另请注意。这似乎解决了你的问题。其他一切似乎都是正确的。

通过您共享的参数,电话或电子邮件将发送到名为param的
电子邮件。相反,它应该是
login

如果您的视图接受电子邮件或电话号码的代码为

<%= f.text_field :email %>
<%= f.text_field :phone %>

然后将其替换为

<%= f.text_field :login %>


这样,发送的参数将是登录,其余将由您的代码处理。如果这仍然给您错误,请告诉我。参考除了使用用户名之外,它实现了相同的功能。另请注意。这似乎解决了你的问题。其他一切似乎都是正确的。

您应该覆盖默认登录行为

User.rb(将此代码放在User.rb模型中)


您应该覆盖默认登录行为

User.rb(将此代码放在User.rb模型中)


请在注册时共享您的视图的电子邮件和电话代码请在注册时共享您的视图的电子邮件和电话代码Gi已修改视图,现在我收到以下错误。PG::UndefinedColumn:错误:column users.login不存在您是否在
user.rb
中定义了
find\u for_database\u身份验证
方法?是否添加了
find\u for_database\u身份验证
方法?很高兴我能帮上忙!!我已经修改了视图,现在我得到了以下错误。PG::UndefinedColumn:错误:column users.login不存在您是否在
user.rb
中定义了
find\u for_database\u身份验证
方法?是否添加了
find\u for_database\u身份验证
方法?很高兴我能帮上忙!!