我有一个使用devise gem进行身份验证的Rails 4应用程序。 我在user.rb中有一个validates_uniqueness_of:email检查
尽管进行了此检查,但我仍在users表中看到重复的条目。
奇怪的是,这些重复的条目是在登录时创建的。对于用户登录。
我正在调用after_action来更新字段发布登录信息,如下所示- 这是在sessions_controller.rb-
中after_action :update_login_terms_and_privacy_accepted_at, only: [:create]
def create
if params[:user][:terms_and_condition].present? && params[:user][:terms_and_condition]=="0"
self.resource = resource_class.new(sign_in_params)
reset_session
flash[:error] = "Please accept our terms and conditions"
redirect_to new_user_session_url
elsif Rails.env.production? && !verify_recaptcha
self.resource = resource_class.new(sign_in_params)
reset_session
flash[:error] = "Incorrect Captcha. Please try Again"
redirect_to new_user_session_url
else
if current_user.try(:is_allowed_enterprise_dashboard?)
current_user.update(uuid: SecureRandom.uuid)
cookies[:uuid] = current_user.uuid
end
super
end
end
private
def update_login_terms_and_privacy_accepted_at
self.resource.update_attribute("login_terms_and_privacy_accepted_at", Time.now) if self.resource.login_terms_and_privacy_accepted_at.nil?
end
这是我在日志中看到的-
Started POST "/users/sign_in" for 104.143.209.101 at 2019-06-24 18:24:50 +0000
I, [2019-06-24T18:24:50.783420 #32598] INFO -- : Processing by SessionsController#create as HTML
I, [2019-06-24T18:24:50.783508 #32598] INFO -- : Parameters: {"utf8"=>"✓", "authenticity_token"=>"F8BrJRihhHuNA2a8qe82MbXg6rq/sGSVtFaB3xqzHTMqTSEkU+kvQZNs1sLSLEhCRvH29bof8HgFsyANBuliJA==", "user"=>{"email"=>"su***@gmail.com", "password"=>"[FILTERED]", "terms_and_condition"=>"1", "remember_me"=>"0"}, "g-recaptcha-response"=>"", "commit"=>"Log in"}
I, [2019-06-24T18:24:50.980455 #32598] INFO -- : Redirected to https://gici.com/users/sign_in
I, [2019-06-24T18:24:51.064536 #32598] INFO -- :
Sent mail to su***@gmail.com (57.3ms)
在日志的最后一行中发送的电子邮件是关于创建重复的用户记录的。
我在这里做什么错了?
答案 0 :(得分:0)
那是因为您拥有这一行代码
self.resource = resource_class.new(sign_in_params)
然后在控制器操作之后您要呼叫
update_login_terms_and_privacy_accepted_at
依次调用
self.resource.update_attribute("login_terms_and_privacy_accepted_at", Time.now)
这会将对象保存到数据库中。
请注意,https://apidock.com/rails/ActiveRecord/Persistence/update_attribute
跳过update_attribute中的验证,因此保存对象时不进行验证->因此记录重复。
可能您只在模型级别进行验证。最安全的方法是在数据库级别上强制唯一性。例如,您可以在以下链接中查看如何执行此操作:https://thoughtbot.com/blog/validation-database-constraint-or-both
基本上,您将必须创建迁移并向users
表添加唯一约束。