动态更改ActionMailer电子邮件URL主机

时间:2013-01-15 03:48:12

标签: ruby-on-rails actionmailer

在我的application.html.erb中,我有<%= render @objects %>,它会呈现一堆_object.html.erb个部分,每个部分都有一个<%= link_to(object) %>。我在有人发表评论时发送的电子邮件中呈现相同的单个部分<%= render @object %>,但我希望链接以服务器URL开头。

我已经尝试了一切:

link_to(object)

url_for(object)

before_filter :set_mailer_host
def set_mailer_host
  ActionMailer::Base.default_url_options[:host] = request.host_with_port
end

default_url_options[:host] = "example.com"

def default_url_options
  { host: 'example.com' }
end

......什么都行不通。有或没有:only_links

最后,我刚刚建立了一个愚蠢的助手,它将主机名添加到链接:

# application_controller.rb
before_filter { App::request=request }

# application_helper.rb
def hostify obj
  "http://#{App::request.host_with_port}#{url_for obj}"
end

# _object.html.erb:
<%= link_to obj.title, hostify(object) %>

有正常的方法吗?

3 个答案:

答案 0 :(得分:2)

我无法确切地告诉您要链接的内容或'obj'所指的内容,但您可以执行以下操作:

link_to obj.title, {:host => 'example.com'}

link_to obj.title, {:controller => 'store', :action => 'view_cart', :host => 'example.com'}

答案 1 :(得分:0)

好的,花了一些时间,我想我开始明白了。

您必须使用restful路由,然后您可以在Mailer操作中设置default_url_options[:host] = host,并在default_url_options中为其他控制器设置only_path为true。加:locale

在视图中我有:objects_url(object)

由于我有不同的主机名,因此我在发送邮件时将request.host_with_port作为参数从控制器传递给邮件程序。

link_to不接受参数,url_for()只能从其中部分构建网址。

答案 2 :(得分:0)

def url_options
  { domain: 'example.com' }
end

或者更好地合并,以防您使用其他选项:

def url_options
  { domain: 'example.com' }.merge(super)
end