电子邮件中的Button_to未发布

请参阅此问题的演变更新

在我的网站上,每个用户都有一个仪表板,他/她可以点击链接以接受或拒绝请求。 根据所点击的内容,然后使用相关状态修补请求记录。 为了方便用户,我试图将这个仪表板嵌入到他们的电子邮件中,以便他们永远不必直接访问该网站; 想一个看起来像这样的电子邮件:

嗨,您好,

您有以下请求,请单击请求旁边的“接受/拒绝”

  • 请求A:接受,拒绝
  • 请求B:接受,拒绝

….

到目前为止,实现这项工作的唯一方法是为电子邮件中使用的链接提供一组并行的GET路由,而不是实际网站仪表板中使用的链接的PATCH路由。

想知道是否有更好的方法吗?

路线

patch 'inventories/:id/accept', to: 'inventories#accept', as: 'lender_accept' patch 'inventories/:id/decline', to: 'inventories#decline', as: 'lender_decline' get 'inventories/:id/accept_email', to: 'inventories#accept', as: 'lender_accept_email' get 'inventories/:id/decline_email', to: 'inventories#decline', as: 'lender_decline_email' 

链接电子邮件

  

链接在网站仪表板上

  

UPDATE

好的尝试使用button_to生成一个POST表单,以避免使用GET进行POST,就像上面的“补丁”解决方案一样,仍然无法正常工作……

路线:

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

梅勒观点:

   

我在电子邮件上做了一个检查元素,只是为了确认button_to是否生成了相应的代码:

 

在我的邮件设置中,我将主机正确设置为我的域名,所以当我收到电子邮件并单击按钮时,我会被/inventories/2037/decline适当地/inventories/2037/decline ,但我仍然得到错误,因为显然日志说我还在努力争取GET …为什么?

 2014-08-17T06:18:03.206205+00:00 app[web.1]: ActionController::RoutingError (No route matches [GET] "/inventories/2037/decline"): 

想知道是否有更好的方法吗?

提出GET请求是理想的解决方案。 不要使用任何其他请求。 它可能不受电子邮件客户端的支持,并可能增加大的安全漏洞。

您错误地认为大型网站使用post/patch请求在电子邮件中执行此类操作。 它们都使用get请求,它们包含一些令牌,当用户访问网站时,该令牌被绑定/触发特定操作。

确定尝试了button_to生成一个POST表单,以避免使用GET进行POST,就像上面的“补丁”解决方案一样,仍然无法正常工作。

显然,它不会起作用。 没有rails JavaScript文件。 而且,即使你包含它也不会,因为csrf-token令牌。 在rails应用程序中,默认情况下不允许外部表单提交。

我的建议是通过一些额外的参数( like www.example.com/dashboard?take_action=accept将用户发送到您的dashboard ,并使用JavaScript来触发所需的操作。 这将是最佳做法。 这样可以避免使用lender_accept请求作为get

更确切地说, 不要这样做

 get 'inventories/:id/accept_email', to: 'inventories#accept', as: 'lender_accept_email' get 'inventories/:id/decline_email', to: 'inventories#decline', as: 'lender_decline_email' 

这是不好的。 因为, get请求不是为了updating/deleting

因为,您希望将此actions链接到您的email ,您应该将dashboard链接添加一些额外的参数。 现在,只要您看到传递给电子邮件的参数,JavaScript就会执行accept/decline操作。

更多:

  • 我可以将Get和Post URL链接都放在电子邮件中

  • 是否可以从HTML电子邮件执行HTTP POST?

  • 是否可以从Outlook电子邮件中发送POST请求?

我很确定电子邮件中的链接无法使用“PATCH”方法,因为电子邮件没有rails.js 。 ( https://github.com/rails/jquery-ujs/blob/master/src/rails.js

我不认为嵌入rails.js会起作用,因为大多数电子邮件合法提供商可能会禁用电子邮件中的javascript。

你可以将get 'inventories/:id/accept', to: 'inventories#accept', as: 'lender_accept'在你的路线中绕过这个问题,但是如果使用get是不好的做法,如果你实际上在改变数据库中的任何东西。

我的简单解决方案是将用户链接到他们可以在您的网站上接受或拒绝的某个页面,而不是接受或拒绝该电子邮件。