邮件程序文件
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文件中使用的相同部分也用于常规视图页面,并且在该页面上,路由工作正常。
答案 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