2013-01-11 37 views
5

我很难搞清楚“Rails方式”以向邮件程序添加电子邮件确认URL。Rails:使自定义URL助手的行为像内置_path&_url助手

我选择不纯粹以REST风格执行此操作,因为使用文本电子邮件很困难,因为它们不能PUT请求。

所以这里是我的routes.rb:get 'confirm/:id' => 'Confirmations#confirm'

,并在我的邮件我喜欢把email_confirm_url(@user.email_token),我希望发生的URL。

我创造了一个帮手:

#app/helpers/confirmations_helper.rb 
module ConfirmationsHelper 
    def email_confirm_url(token) 
    "/confirm/#{token}" 
    end 
end 

这一切工作的排序,除非我打电话email_confirm_url(@user.email_token) ...

我真的得到: “/confirm/abcdefg…

当我要的是: http://myhostname/confirm/abcdefg…

或正在开发中:http://localhost:3000/confirm/abcdefg…

如何让我的URL帮助器更像在Rails中构建的<resource>_path<resource>_url帮助器?虽然现实,我想我真的只有需要_url

#Edit:我有这个在我的环境配置:

#config/environments/development.rb 
... 
config.action_mailer.default_url_options = { :host => "localhost:3000" } 

回答

0

为了访问请求对象,你应该在控制你的邮件实现该功能,并把它传递给一个模板变量。

应用程序/邮寄/ emailer.rb

@tracking_url = "http://#{request.host}:#{request.port}/confirm/#{token}" 

应用程序/视图/电子邮件使用者/ template_name.html.erb

<%= link_to 'name', @tracking_url %> 
+0

'ActionView :: Template :: Error:未定义方法'host'for nil:NilClass'我想我记得有些东西在Mailer中无法访问'host'或'host_with_port'!任何方式在这个? – Meltemi

+0

基于上述评论更新了答案,让我知道如果这有效。 – zarazan

0

关于使用已经存在的URL加上串联什么?即你可以使用root_pathroot_url,然后你连接并且行为和rails完全一样!

例如,你可以这样做:

def mystrangemethod_url(option1, option2) 
    "#{ root_url }/#{ option1 }/#{ option2 }" 
end 

和你做。容易和唯一的要求是设置设置您的根路径routes.rb。此外,您在development.rb中设置的选项也可以在邮件程序中使用。

+0

我认为Q更像是如何从视图中透明地访问'mystrangemethod_url'。 – mlt

相关问题