В Actionmailer, как вы можете переопределить default_url_options во время выполнения? - PullRequest
0 голосов
/ 07 февраля 2012

Мне нужно иметь возможность генерировать ссылки на сайты, которые запускаются из моего приложения, но имеют разные домены (я использую сервис whitelabel).

Электронное письмо, отправляемое от имени этих доменов для установки другого хоста в зависимости от почтового сообщения.

Обычно я бы установил host значение application.rb :

config.action_mailer.default_url_options[:host] = 'myhost.com'

Однако, поскольку мой хост меняется в зависимости от ссылки, я пытаюсь сделать это во время выполнения.

user_mailer.rb

Rails.configuration.action_mailer.default_url_options[:host] = new_host
mail(...)

Проблема в том, что каждый раз, когда я запускаю это, он продолжает использовать то, что определено в application.rb. Кажется, я не могу заставить приложение соблюдать только что определенное значение default_url_optiions[:host]. Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Если не так много представлений, вы можете просто определить хост в помощнике url_for, и если существует слишком много представлений, я бы предложил вам написать свой собственный помощник, который обертывает помощника url_for с :host => 'mysite.com'.

0 голосов
/ 07 мая 2015

Метод default_url_options устанавливается в ActionMailer с использованием class_attribute, который определен в основных расширениях ActiveSupport для Class. Согласно документации, он также предоставляет средство доступа уровня экземпляра, которое может быть переопределено для каждого экземпляра без влияния на метод уровня класса. Таким образом, вы должны иметь возможность переопределить настройки хоста непосредственно для каждого письма

class UserMailer < ActionMailer::Base
  def welcome(user)
    @user = user

    # don't need this if you override #mail method.
    self.default_url_options = default_url_options.merge(host: @user.host)

    mail(to: user.email, subject: "Welcome")
  end

  # might be better to override mail method if you need it for all emails in
  # a particular mailer
  private

  def mail(headers, &block)
    self.default_url_options = default_url_options.merge(host: @user.host)

    super
  end
end

Это должно позволить вам изменить настройки во время выполнения; пожалуйста, проигнорируйте вызов @ user.host и замените его на то, каким вы будете определять хост.

...