1

邮件文件

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

4

1 回答 1

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每个实例的属性

于 2014-08-16T18:48:21.513 回答