如何排除来宾用户收到电子邮件 Rails 4 设计

How to exclude guest users from getting emailed Rails 4 Devise

只需在 Rails 上设置我的第一个邮件程序 4. 当新用户使用 devise 注册(创建)新帐户后,我会立即向他们发送一封欢迎电子邮件。

我还设计了一个设置,如果 current_user 没有找到,就会创建一个来宾用户。不幸的是,这会干扰邮件程序。每次创建来宾帐户时,邮件程序都会向不存在的电子邮件发送一封电子邮件。

我无法弄清楚如何从邮件中排除客人。

user.rb:

after_create :send_welcome_mail
def send_welcome_mail
  UserMailer.welcome_email(self).deliver
end

mailers/user_mailer.rb:

class UserMailer < ActionMailer::Base
  default from: "example@gmail.com"

  def welcome_email(user)
    @user = user
    mail(:to => user.email, :subject => "Welcome!")
  end

end

application_controller.rb(嘉宾创作):

def current_or_guest_user
    if current_user
      if session[:guest_user_id] && session[:guest_user_id] != current_user.id
        logging_in
        guest_user(with_retry = false).try(:destroy)
        session[:guest_user_id] = nil
      end
      current_user
    else
      guest_user
    end
  end

  # find guest_user object associated with the current session,
  # creating one as needed
  def guest_user(with_retry = true)
    # Cache the value the first time it's gotten.
    @cached_guest_user ||= User.find(session[:guest_user_id] ||= create_guest_user.id)

  rescue ActiveRecord::RecordNotFound # if session[:guest_user_id] invalid
     session[:guest_user_id] = nil
     guest_user if with_retry
  end

  private

  # called (once) when the user logs in, insert any code your application needs
  # to hand off from guest_user to current_user.
  def logging_in
    # For example:
    # guest_comments = guest_user.comments.all
    # guest_comments.each do |comment|
      # comment.user_id = current_user.id
      # comment.save!
    # end
  end

  def create_guest_user
    u = User.create(:name => "guest", :email => "guest_#{Time.now.to_i}#{rand(100)}@example.com")
    u.save!(:validate => false)
    session[:guest_user_id] = u.id
    u
  end

我相信这很容易,但我对 rails 还是个新手,对解决这个问题的最佳方法有点困惑。如果您需要任何其他代码,请告诉我。

def welcome_email(user)

  # The following line is unnecessary. Normally, you do
  # something like this when you want to make a variable
  # available to a view

  #@user = user

  # You can make the if more explicit by writing
  # if user.id == nil, but if will return false in
  # Ruby if a value doesn't exist (i.e. is nil)

  if user.id
    mail(:to => user.email, :subject => "Welcome!")
  end

end