ruby-on-rails Rails3:重写url_for以获得子域支持,如何扩展action mailer以使用此类url_for

bwleehnv  于 2023-02-26  发布在  Ruby
关注(0)|答案(3)|浏览(165)

我从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的最佳做法是什么

mwkjh3gx

mwkjh3gx1#

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

Source

13z8s7eq

13z8s7eq2#

我有一个解决这个问题的方法,但我不认为这仍然是最好的方式来做到这一点。我已经尝试,并将继续尝试拿出一个更好的解决方案,但这里是我在我的电子邮件模板所做的。我把这个放在电子邮件模板的原因是因为我正在使用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)
mzsu5hc0

mzsu5hc03#

我发现在Rails 3.0.x上最简单的解决方案是在我的邮件程序视图中的每个URL中手动构造主机和子域。

Your account is here:

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

--您的@account模型知道它的子域。
这是一个很好的简单的,线程安全的,隔离的,你不需要污染代码库的其他部分,而且一旦你转移到Rails3.1.x,很容易退出,我相信它会自动处理所有这些。

相关问题