当rails 4应用程序托管在子域上时,例如sub.domain.com
,如何让Action Mailer模板中的网址正确链接到子域名?
配置/环境/ production.rb:
config.action_mailer.default_url_options = { :host => 'sub.domain.com' }
动作邮件模板链接示例:
<%= user_url(@user) %>
在电子邮件中,该链接显示为www.domain.com/users/1
,而不是sub.domain.com/users/1
答案 0 :(得分:7)
实际上很容易。我解决这个问题的最佳建议是你创建一个before_filter,它在ApplicationController.rb中的每个请求上设置它,如下所示:
before_filter :set_mailer_host
def set_mailer_host
ActionMailer::Base.default_url_options[:host] = request.host_with_port
end
答案 1 :(得分:4)
我怀疑这对你来说仍然是一个问题,但我想我会添加一些有用的东西。
除了在各种配置文件中添加default_url_options(确保在所有需要的环境中添加它)之外,您还需要获取整个网址,而不仅仅是路径。
<%= url_for() %>
您可以将子域或域指定为参数,以及其他几个选项(来自apidock):
url_for(options = nil) public根据选项生成网址 提供,default_url_options和routes.rb中定义的路由。该 支持以下选项:
:only_path - 如果为true,则返回相对url。默认为false。
:protocol - 要连接的协议。默认为“http”。
:host - 指定链接应定位到的主机。如果 :only_path为false,必须显式提供此选项, 或通过default_url_options。
:subdomain - 使用tld_length指定链接的子域 从主机拆分子域。如果为false,则删除所有子域 来自链接的主机部分。
:domain - 使用tld_length指定链接的域 将域从主机中分离出来。
:tld_length - 由TLD id组成的标签数量,仅在使用时使用 :提供子域或:域。默认为 ActionDispatch :: Http :: URL.tld_length,它默认为1。
:port - 可选择指定要连接的端口。
:anchor - 要附加到路径的锚名称。
:trailing_slash - 如果为true,则添加一个尾部斜杠,如 “/存档/ 2009 /”
:script_name - 指定相对于域根的应用程序路径。如果 提供,预先申请路径。
给url_for的任何其他键(:controller,:action等)是 转发到路由模块。
我使用link_to与路线的“_url”结束。像这样:
<%= link_to 'Yes', response_approvals_url(t: @secret_token) %>
答案 2 :(得分:1)
有关详细信息,请点击此处http://railscasts.com/episodes/221-subdomains-in-rails-3和https://github.com/plataformatec/devise/wiki/How-To:-Send-emails-from-subdomains
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
答案 3 :(得分:0)
我不相信,这是一个缓存问题。我使用delayed_job https://github.com/collectiveidea/delayed_job来运行邮件程序。事实证明,当延迟的作业脚本运行时,它似乎缓存了邮件程序模板。
解决方案:RAILS_ENV=production bin/delayed_job restart
就是这样!知道什么是缓存以及在哪里。