我有一个相对简单的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
然而,尽管我尝试降低用户输入的电子邮件地址,但大写字母仍会导致错误!任何人都可以给我的任何帮助将不胜感激! 感谢
答案 0 :(得分:2)
尝试在此处添加.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
,而你无法在零对象上调用uuid
方法。
答案 1 :(得分:1)
虽然,我已经在上面标记了正确的答案,但我想提一下javascript onchange事件也解决了这个问题!
<%= f.input_field :email, placeholder: "Email", id:"email", onchange: "this.value=this.value.toLowerCase();" %>
答案 2 :(得分:0)
为什么要手动检查电子邮件是否已存在?通常设计为你做。 (您是否指定了良好的用户表名称?
要降低控制器中的大小写以降低可以执行的参数
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
这样的事情。您不需要使用begin / rescue