路由指向example.com的URL帮助程序

时间:2014-08-16 18:30:35

标签: ruby-on-rails url ruby-on-rails-4 routes urlhelper

邮件程序文件

button_to 'YES', lender_accept_url(borrow), method: :post, id: "accept #{borrow.id}", style: "background-color:green; color: white; width: 40px; display: inline"
button_to 'NO', lender_decline_url(borrow), method: :post, id: "decline #{borrow.id}", style: "background-color:gray; width: 40px; display: inline"

路线

post 'inventories/:id/accept', to: 'inventories#accept', as: 'lender_accept'
post 'inventories/:id/decline', to: 'inventories#decline', as: 'lender_decline'

但是,当我点击电子邮件中的按钮时,我需要http://example.com/inventories/:id/decline

为什么URL帮助器不会通向我自己的域?请注意,Mailer文件中使用的相同部分也用于常规视图页面,并且在该页面上,路由工作正常。

1 个答案:

答案 0 :(得分:1)

邮件程序与http请求/响应周期分离:他们不知道当前的请求是什么(很像你的模型),因此当前的主机是什么。它们甚至可能不会从请求中使用(例如,如果您的电子邮件是从cronjob发送的)。另一方面,您的视图可以查看当前请求以了解当前主机的内容,以便它们生成正确的URL。

有两种方法可以解决这个问题:

您可以设置

config.action_mailer.default_url_options = { host: "example.com" }

在application.rb或每个环境文件中。

或者在调用URL帮助程序时显式设置主机。这将要求发送电子邮件的任何人将所需的主机传递给邮件程序(例如,使用request.host)。邮件程序会将其存储在实例变量中,例如@host,然后在您的视图中使用

lender_accept_url(borrow, host: @host)

这样做的缺点是,与常规控制器操作共享视图/部分需要您在那里设置@host。

作为中途方法,您还应该能够在每个实例属性上设置default_url_options