为什么在使用 tail 将开发输出记录到 bash 时我会得到两次 "User Exists"?
why do i get "User Exists" twice when logging development output to bash with tail?
我将 User 模型中的邮件程序调用移至自定义 Devise 控制器,但在开发过程中突然收不到电子邮件。 SMTP 全部在配置中设置并正常工作(我知道是因为当邮件调用在用户模型中作为 :after_create
时它可以工作——顺便说一下,这在生产中不起作用)。
所以我 运行 tail -f log/development.log
,点击提交以查看是否存在由我的 Devise 扩展引起的路由冲突,并在我的#create 操作
的输出中发现了这一点
Started POST "/users" for ::1 at 2016-07-03 14:48:06 -0700
Processing by Devise::RegistrationsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"blahblah", "user"=>{"email"=>"j@q.com", "firstname"=>"i", "lastname"=>"i", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}
(0.3ms) BEGIN
User Exists (0.4ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = 'j@q.com' LIMIT 1
User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = 'j@q.com' LIMIT 1
SQL (0.6ms) INSERT INTO "users" ("email", "encrypted_password", "firstname", "lastname", "created_at", "updated_at") VALUES (, , , , , ) RETURNING "id" [["email", "j@q.com"], ["encrypted_password", "aYxM8UHDnwS8lcxhiE6Gn.VAbLo8bE8HggCQVuIPl8XYXaevHt8F."], ["firstname", "i"], ["lastname", "i"], ["created_at", "2016-07-03 21:48:06.899722"], ["updated_at", "2016-07-03 21:48:06.899722"]]
(0.4ms) COMMIT
看起来我的 Devise 扩展甚至没有被使用?
这是#create 操作
class RegistrationsController < Devise::RegistrationsController
def create
@user = User.new(sign_up_params)
if @user.save
UserMailer.new_user(@user).deliver_now
#AdminMailer.new_user_waiting_for_approval(@admin).deliver_now
else
render :action => 'new'
end
end
private
def sign_up_params
params.require(:user).permit(:firstname, :lastname, :email, :password, :password_confirmation, :approved)
end
end
我的用户模型
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :items, dependent: :destroy
validates :email, presence: true, uniqueness: true, if: -> { self.email.present? }
validates :firstname, presence: true
validates :lastname, presence: true
def active_for_authentication?
super && approved?
end
def inactive_message
if !approved?
:not_approved
else
super # Use whatever other message
end
end
end
然后我的路线是devise_for :users, :controller => { registrations: 'registrations'}
所以我想这是一个由两部分组成的问题:
- 双
User Exists
表示什么吗?
- 我的设置有什么问题?我已经按照 Rail 的官方文档去了 T.
首先将您的设备路由配置更改为:
devise_for :users, controllers: { registrations: 'registrations'}
并且在您的用户验证中,我认为您应该删除 if
选项
validates :email, presence: true, uniqueness: true
我认为应该可以解决这个问题。为什么?因为唯一性会首先检查记录是否存在于数据库中,然后 if
选项也会做同样的事情。不太确定我的想法是否正确,但我认为应该是问题所在。
如果我能提供帮助,请告诉我。
PS: 有一个已知的 Rails 错误,它还会将您的 SQL 语句发送到日志两次,我认为它正在修复或者它有一个待处理的 PR,这是由于在您的 Rails 应用程序中设置了不同的记录器造成的。我不认为你的与此有关,因为执行 SQL 语句所花费的时间有所不同。
我将 User 模型中的邮件程序调用移至自定义 Devise 控制器,但在开发过程中突然收不到电子邮件。 SMTP 全部在配置中设置并正常工作(我知道是因为当邮件调用在用户模型中作为 :after_create
时它可以工作——顺便说一下,这在生产中不起作用)。
所以我 运行 tail -f log/development.log
,点击提交以查看是否存在由我的 Devise 扩展引起的路由冲突,并在我的#create 操作
Started POST "/users" for ::1 at 2016-07-03 14:48:06 -0700
Processing by Devise::RegistrationsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"blahblah", "user"=>{"email"=>"j@q.com", "firstname"=>"i", "lastname"=>"i", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}
(0.3ms) BEGIN
User Exists (0.4ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = 'j@q.com' LIMIT 1
User Exists (0.3ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = 'j@q.com' LIMIT 1
SQL (0.6ms) INSERT INTO "users" ("email", "encrypted_password", "firstname", "lastname", "created_at", "updated_at") VALUES (, , , , , ) RETURNING "id" [["email", "j@q.com"], ["encrypted_password", "aYxM8UHDnwS8lcxhiE6Gn.VAbLo8bE8HggCQVuIPl8XYXaevHt8F."], ["firstname", "i"], ["lastname", "i"], ["created_at", "2016-07-03 21:48:06.899722"], ["updated_at", "2016-07-03 21:48:06.899722"]]
(0.4ms) COMMIT
看起来我的 Devise 扩展甚至没有被使用?
这是#create 操作
class RegistrationsController < Devise::RegistrationsController
def create
@user = User.new(sign_up_params)
if @user.save
UserMailer.new_user(@user).deliver_now
#AdminMailer.new_user_waiting_for_approval(@admin).deliver_now
else
render :action => 'new'
end
end
private
def sign_up_params
params.require(:user).permit(:firstname, :lastname, :email, :password, :password_confirmation, :approved)
end
end
我的用户模型
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :items, dependent: :destroy
validates :email, presence: true, uniqueness: true, if: -> { self.email.present? }
validates :firstname, presence: true
validates :lastname, presence: true
def active_for_authentication?
super && approved?
end
def inactive_message
if !approved?
:not_approved
else
super # Use whatever other message
end
end
end
然后我的路线是devise_for :users, :controller => { registrations: 'registrations'}
所以我想这是一个由两部分组成的问题:
- 双
User Exists
表示什么吗? - 我的设置有什么问题?我已经按照 Rail 的官方文档去了 T.
首先将您的设备路由配置更改为:
devise_for :users, controllers: { registrations: 'registrations'}
并且在您的用户验证中,我认为您应该删除 if
选项
validates :email, presence: true, uniqueness: true
我认为应该可以解决这个问题。为什么?因为唯一性会首先检查记录是否存在于数据库中,然后 if
选项也会做同样的事情。不太确定我的想法是否正确,但我认为应该是问题所在。
如果我能提供帮助,请告诉我。
PS: 有一个已知的 Rails 错误,它还会将您的 SQL 语句发送到日志两次,我认为它正在修复或者它有一个待处理的 PR,这是由于在您的 Rails 应用程序中设置了不同的记录器造成的。我不认为你的与此有关,因为执行 SQL 语句所花费的时间有所不同。