Rails3: переписать url_for для поддержки поддоменов, как расширить почтовую программу для использования такого url_for - PullRequest
4 голосов
/ 15 ноября 2010

Я беру код с Субдомен RailsCast

module UrlHelper
  def with_subdomain(subdomain)
    subdomain = (subdomain || "")
    subdomain += "." unless subdomain.empty?
    [subdomain, request.domain, request.port_string].join
  end

  def url_for(options = nil)
    if options.kind_of?(Hash) && options.has_key?(:subdomain)
      options[:host] = with_subdomain(options.delete(:subdomain))
    end
    super
  end
end

class ApplicationController < ActionController::Base
  include UrlHelper
end  

Можно использовать модифицированный url_for в представлениях контроллеров. Но у меня проблемы с ActionMailer.

Я пытался использовать следующее:

class Notifier < ActionMailer::Base
  include UrlHelper
end

Но представления ActionMailer по-прежнему используют старый неизмененный url_for из ActionDispatch :: Routing :: RouteSet.

Как лучше добавлять новые URL_for

Ответы [ 3 ]

5 голосов
/ 11 мая 2011

Добавьте следующий код в файл app / helpers / url_helper.rb:

def set_mailer_url_options
    ActionMailer::Base.default_url_options[:host] = with_subdomain(request.subdomain)
end

и измените файл app / controllers / application_controller.rb, добавив:

before_filter :set_mailer_url_options

Источник

1 голос
/ 18 ноября 2010

У меня есть решение этой проблемы, но я не думаю, что это все еще лучший способ сделать это.Я пытался и все еще буду пытаться найти лучшее решение, но вот что я сделал в своем шаблоне электронной почты.Причина, по которой я добавил это в шаблон электронной почты, заключается в том, что я использую Devise, но я надеюсь придумать что-нибудь получше.

subdomain = @resource.account.subdomain
subdomain = (subdomain || "")
subdomain += "." unless subdomain.empty?
host = [subdomain, ActionMailer::Base::default_url_options[:host]].join

Теперь вы можете передать хост url_for вот так

user_confirmation_url(:host => host)
0 голосов
/ 07 октября 2011

Я обнаружил, что самым простым решением на Rails 3.0.x было создание узла host-with-subdomen вручную в каждом URL в моих представлениях почтовой программы.Например:

Your account is here:

<%= account_url(:host => "#{@account.subdomain}.#{ActionMailer::Base.default_url_options[:host]}" %>

- где ваша модель @account знает свой поддомен.

Это красиво и просто, безопасно для потоков и изолированно.Вам не нужно загрязнять другие части вашей кодовой базы.И легко вернуться назад, как только вы перейдете на Rails 3.1.x, который должен обрабатывать все это автоматически, я считаю.

...