How can I send emails in Rails 3 using the recipie

2020-05-24 22:30发布

How can I send mails in a mailer using the recipient's locale. I have the preferred locale for each user in the database. Notice this is different from the current locale (I18n.locale), as long as the current user doesn't have to be the recipient. So the difficult thing is to use the mailer in a different locale without changing I18n.locale:

def new_follower(user, follower)
  @follower = follower
  @user = user
  mail :to=>@user.email
end

Using I18n.locale = @user.profile.locale before mail :to=>... would solve the mailer issue, but would change the behaviour in the rest of the thread.

7条回答
劫难
2楼-- · 2020-05-24 23:28

The problem with the mentioned plugins are that they don't work in all situations, for example doing User.human_name or User.human_attribute_name(...) will not translate correctly. The following is the easiest and guaranteed method to work:

stick this somewhere (in initializers or a plugin):

  module I18nActionMailer
    def self.included(base)
      base.class_eval do
        include InstanceMethods
        alias_method_chain :create!, :locale
      end
    end

    module InstanceMethods
      def create_with_locale!(method_name, *parameters)
        original_locale = I18n.locale
        begin
          create_without_locale!(method_name, *parameters)
        ensure
          I18n.locale = original_locale
        end
      end
    end
  end

  ActionMailer::Base.send(:include, I18nActionMailer)

and then in your mailer class start your method by setting the desired locale, for example:

  def welcome(user)
    I18n.locale = user.locale
    # etc.
  end
查看更多
登录 后发表回答