在devise_invitable中覆盖邮件?

Pat*_*nor 5 ruby-on-rails devise

我希望我的应用程序的邀请来自邀请者,而不是系统电子邮件地址.如何从devise.rb覆盖config.mailer_sender?

我在我的邮件中有这个并确认它已被调用,但它没有覆盖:from.注意:它是一个私有方法,我把它作为一个公共方法尝试,没有任何效果.

private

def headers_for(action)
  if action == :invitation_instructions
    headers = {
      :subject       => "#{resource.invited_by.full_name} has invited you to join iTourSmart",
      :from          => resource.invited_by.email,
      :to            => resource.email,
      :template_path => template_paths
    }
  else
    headers = {
      :from          => mailer_sender(devise_mapping),
      :to            => resource.email,
      :template_path => template_paths
    }
  end

  if resource.respond_to?(:headers_for)
    headers.merge!(resource.headers_for(action))
  end

  unless headers.key?(:reply_to)
    headers[:reply_to] = headers[:from]
  end

  headers
end
Run Code Online (Sandbox Code Playgroud)

Ale*_*xey 5

没有任何黑客/猴子补丁的更好的解决方案将是:例如,在您的模型中:

def invite_and_notificate_member user_email
  member = User.invite!({ email: user_email }, self.account_user) do |u|
    u.skip_invitation = true
  end
  notificate_by_invitation!(member)
end

def notificate_by_invitation! member
  UserMailer.invited_user_instructions(member, self.account_user, self.name).deliver
end
Run Code Online (Sandbox Code Playgroud)

在邮件中:

  def invited_user_instructions(user, current_user, sa)
    @user = user
    @current_user = current_user
    @sa = sa
    mail(to: user.email, subject: "#{current_user.name} (#{current_user.email}) has invited you to the #{sa} account ")
  end
Run Code Online (Sandbox Code Playgroud)

因此,您可以将任何主题/数据放在邮件正文中.

祝好运!


Dav*_*vid 4

看看对类似问题的回答,可能会有帮助。

编辑:看来您需要在资源类中定义一个公共 headers_for 方法。

解决方案:将此方法的某个版本放入 User.rb 中,确保它是公共的。

def headers_for(action)
  action_string = action.to_s
  case action_string
  when "invitation" || "invitation_instructions"
    {:from => 'foo@bar.com'}
  else
    {}
  end
end
Run Code Online (Sandbox Code Playgroud)

您必须返回一个哈希值,因为Devise::Mailer它将尝试合并哈希值。