为什么在使用 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'}

所以我想这是一个由两部分组成的问题:

  1. User Exists 表示什么吗?
  2. 我的设置有什么问题?我已经按照 Rail 的官方文档去了 T.

首先将您的设备路由配置更改为:

devise_for :users, controllers: { registrations: 'registrations'}

并且在您的用户验证中,我认为您应该删除 if 选项

validates :email, presence: true, uniqueness: true

我认为应该可以解决这个问题。为什么?因为唯一性会首先检查记录是否存在于数据库中,然后 if 选项也会做同样的事情。不太确定我的想法是否正确,但我认为应该是问题所在。

如果我能提供帮助,请告诉我。

PS: 有一个已知的 Rails 错误,它还会将您的 SQL 语句发送到日志两次,我认为它正在修复或者它有一个待处理的 PR,这是由于在您的 Rails 应用程序中设置了不同的记录器造成的。我不认为你的与此有关,因为执行 SQL 语句所花费的时间有所不同。