Rails 4 ActionMailer子域名网址

时间:2013-10-10 23:37:32

标签: ruby-on-rails-4 actionmailer

当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

4 个答案:

答案 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-3https://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

就是这样!知道什么是缓存以及在哪里。