电子邮件中的Button_to未发布

时间:2014-08-07 18:41:52

标签: ruby-on-rails email ruby-on-rails-4 parameter-passing link-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'

电子邮件中的链接

<%= "#{link_to 'ACCEPT', lender_accept_email_url(borrow), method: :patch} or #{link_to 'DECLINE', lender_decline_email_url(borrow)}" %>

网站信息中心上的链接

<%= "#{link_to 'ACCEPT', lender_accept_path(borrow), method: :patch} or #{link_to 'DECLINE', lender_decline_path(borrow), method: :patch}" %>

更新

好的尝试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 '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"}" %>

我在电子邮件上也做了一个检查元素,以确认button_to正在生成相应的代码:

<form action="inventories/2037/decline" method="post" target="_blank" onsubmit="return window.confirm(&quot;You are submitting information to an external page.\nAre you sure?&quot;);"><div><input style="background-color:gray;width:40px;display:inline" type="submit" value="NO"></div></form>
  <div>
    <input style="background-color:gray;width:40px;display:inline" type="submit" value="NO">
  </div>
</form>

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

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

2 个答案:

答案 0 :(得分:6)

  

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

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

大型网站使用post/patch请求在电子邮件中执行此类操作,这是您的误解。他们都使用get个请求,它们包括一些令牌,当用户访问网站时,这些令牌被绑定/触发特定操作。

  

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

显然,它不起作用。没有rails JavaScript文件。此外,即使您包含它也不会有效,因为csrf-token令牌。 rails应用程序默认不允许外部表单提交。

我的建议是通过一些额外的参数dashboard将用户发送到您的like www.example.com/dashboard?take_action=accept,并使用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

由于您要将此actionsemail相关联,因此您应将dashboard链接添加一些额外参数。现在,只要您看到传递给电子邮件的参数,就可以使用JavaScript执行accept/decline操作。

更多:

答案 1 :(得分:1)

我很确定电子邮件中的链接无法使用“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是不好的做法。

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