【问题标题】:Rails - Capitalized Email Addresses cause errors no matter what I tryRails - 无论我尝试什么,大写的电子邮件地址都会导致错误
【发布时间】:2017-04-21 09:49:16
【问题描述】:

我有一个相对简单的 Rails 应用程序,带有一个使用 Devise gem 的表单。该表格不需要用户名,但需要电子邮件地址。一切正常,当用户的电子邮件地址全为小写时,页面会将用户引导至下一页。但是,当用户在字符串中输入带有大写字符的电子邮件地址时,我从 Rails 收到以下错误:

NoMethodError at /users
undefined method `uuid' for nil:NilClass

RegistrationsController#create
app/controllers/registrations_controller.rb, line 81

在第 81 行 (email: new_user.email,):

account         = Account.create(user: resource)
new_user        = User.find_by_email(params[:user][:email])
recurly_account = Recurly::Account.create(
        account_code: new_user.uuid,
        email:        new_user.email,
        first_name:   new_user.first_name,
        last_name:    new_user.last_name
)
sign_in new_user

请求参数:

{"utf8"=>"✓",
 "authenticity_token"=>"ySBGjHGNwiyeBqGh9nv0N5a8fIJO51bi1nIByev6a21Zh+ncMx5d99cTGKbKWpPvdYmGiBfLX9Gya0qmglrBWg==",
 "plan"=>"10day-fmf",
 "disc"=>"firstmonthfree10day",
 "user"=>{"first_name"=>"asdf", "last_name"=>"asdfsadf", "email"=>"Fjsdlkjs@FLFklsd.com", "password"=>"lsdkjlfkjlskjdf"},
 "commit"=>"TRY RISK FREE!",
 "controller"=>"registrations",
 "action"=>"create"}

--用大写字母记下电子邮件地址

我对这个问题进行了广泛的研究,发现它与电子邮件地址没有正确小写有关。因此,根据我的研究,我将以下代码添加到各种文件中:

# Devise.rb
config.case_insensitive_keys = [:email]
# User.rb
def downcase_email
  self.email.downcase!
end

#registrations_controller.rb
def check_email
  email = params[:email].downcase
  check = User.where(email: email).first

  begin
    check_recurly = Recurly::Account.find(email)

    if check_recurly
      recurly_email = "taken"
    end
  rescue Recurly::Resource::NotFound => e
    recurly_email = "available"
  end

然而,尽管我尝试过将用户输入的电子邮件地址小写,但大写字母仍然会导致错误!任何人都可以给我的任何帮助将不胜感激! 谢谢

【问题讨论】:

标签: ruby-on-rails ruby email devise


【解决方案1】:

尝试在此处添加.downcase
new_user = User.find_by_email(params[:user][:email].downcase)

我想你在数据库中存储了小写的电子邮件值,但在params[:user][:email] 的控制器中你有“Fjsdlkjs@FLFklsd.com”。这就是为什么User.find_by_email(params[:user][:email]) 返回nil,而你不能在一个nil 对象上调用uuid 方法。

【讨论】:

  • 谢谢!这对我有用,你的回答很有意义!
【解决方案2】:

您为什么要手动检查电子邮件是否已存在?设计通常会为您执行此操作。 (你指定好的用户表名了吗?

降低控制器中的大小写以降低您可以执行的参数

before_action :downcase_email, if: -> { params[:user][:email].present? }

def downcase_email
  params[:user][:email].downcase!
end

顺便说一句,您可以将此方法 check_email 重构为:

def check_email
  return unless params[:email].present?

  user = User.find_by_email(params[:email].downcase)
  return 'taken' if Recurly::Account.find(user)
  'available'
end

类似的东西。你不需要使用开始/救援

【讨论】:

    【解决方案3】:

    虽然我已经在上面标记了正确答案,但我想提一下,一个小的 javascript onchange 事件也解决了这个问题!

    <%= f.input_field :email,  placeholder: "Email", id:"email", onchange: "this.value=this.value.toLowerCase();" %>
    

    【讨论】:

      猜你喜欢
      • 2020-10-01
      • 1970-01-01
      • 2018-05-23
      • 2012-10-22
      • 2017-10-27
      • 2012-07-26
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多