4

例如,当 Rails 4 应用程序托管在子域上时sub.domain.com,如何在 Action Mailer 模板中获取 URL 以正确链接到子域?

配置/环境/production.rb:

config.action_mailer.default_url_options = { :host => 'sub.domain.com' }

动作邮件模板链接示例:

<%= user_url(@user) %>

在电子邮件中,链接显示www.domain.com/users/1sub.domain.com/users/1

4

4 回答 4

6

这实际上很容易。我对解决这个问题的最佳建议是创建一个 before_filter,在 ApplicationController.rb 中的每个请求上设置它,如下所示:

before_filter :set_mailer_host

  def set_mailer_host
    ActionMailer::Base.default_url_options[:host] = request.host_with_port
  end
于 2013-10-11T00:10:00.620 回答
4

我怀疑这对你来说仍然是一个问题,但我想我会添加一些我发现与此相关的有用的东西。

除了在各种配置文件中添加你的 default_url_options(确保在所有需要它的环境中添加它)之外,你还需要获取整个 url,而不仅仅是路径。

<%= url_for() %>

您可以指定子域或域作为参数,以及其他几个选项(来自 apidock):

url_for(options = nil) public 根据提供的选项、default_url_options 和 routes.rb 中定义的路由生成 url。支持以下选项:

:only_path - 如果为真,则返回相对 url。默认为假。

:protocol - 要连接的协议。默认为“http”。

:host - 指定链接应针对的主机。如果 :only_path 为 false,则必须显式或通过 default_url_options 提供此选项。

:subdomain - 指定链接的子域,使用 tld_length 将子域与主机分开。如果为 false,则从链接的主机部分中删除所有子域。

:domain - 指定链接的域,使用 tld_length 将域与主机分开。

:tld_length - TLD id 组成的标签数量,仅在提供 :subdomain 或 :domain 时使用。默认为 ActionDispatch::Http::URL.tld_length,而后者又默认为 1。

:port - 可选择指定要连接的端口。

:anchor - 要附加到路径的锚名称。

:trailing_slash - 如果为真,添加一个斜杠,如“/archive/2009/”</p>

:script_name - 指定相对于域根的应用程序路径。如果提供,则添加应用程序路径。

给 url_for 的任何其他键(:controller、:action 等)都会转发到 Routes 模块。

我最终使用了带有“_url”结尾的link_to。像这样:

<%= link_to 'Yes', response_approvals_url(t: @secret_token) %>
于 2014-06-05T20:38:51.990 回答
1

有关更多详细信息,请单击此处http://railscasts.com/episodes/221-subdomains-in-rails-3和此处https://github.com/plataformatec/devise/wiki/How-To:-Send-emails-来自子域

 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 

将以下代码添加到文件 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
于 2013-10-11T16:03:18.577 回答
0

我不相信,缓存问题。我使用delayed_job https://github.com/collectiveidea/delayed_job来运行邮件程序。事实证明,当延迟作业脚本运行时,它似乎缓存了邮件模板。

解决方案:RAILS_ENV=production bin/delayed_job restart

而已!知道缓存的内容和位置是值得的。

于 2013-10-11T08:39:09.800 回答