4

我从Subdomain 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 视图仍然使用来自 ActionDispatch::Routing::RouteSet 的旧的未修改的 url_for。

添加新 url_for 的最佳做法是什么

4

3 回答 3

5

将以下代码添加到文件 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

来源

于 2011-05-11T05:50:15.997 回答
1

我有这个问题的解决方案,但我认为这仍然不是最好的方法。我已经尝试并且仍然会尝试提出更好的解决方案,但这是我在电子邮件模板中所做的。我把它放在电子邮件模板中的原因是因为我正在使用 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)
于 2010-11-18T15:00:36.110 回答
0

我发现 Rails 3.0.x 上最简单的解决方案是在我的邮件程序视图中的每个 URL 中手动构建 host-with-subdomain。例如:

Your account is here:

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

-- 你的@account模型知道它的子域。

这很好,很简单,线程安全且隔离。您不需要污染代码库的其他部分。一旦你迁移到 Rails 3.1.x 就很容易退出,我相信它应该会自动处理所有这些。

于 2011-10-07T14:00:52.640 回答