jam*_*mes 2 email ruby-on-rails parameter-passing link-to ruby-on-rails-4
请参阅此问题的演变更新
在我的网站上,每个用户都有一个仪表板,他/她可以点击链接以接受或拒绝请求.根据所点击的内容,然后使用相关状态修补请求记录.为了方便用户,我试图将这个仪表板嵌入到他们的电子邮件中,以便他们永远不必直接访问该网站; 想一下看起来像这样的电子邮件:
嗨,您好,
您有以下请求,请单击请求旁边的ACCEPT/DECLINE
....
到目前为止,实现这项工作的唯一方法是为电子邮件中使用的链接提供一组并行的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'
Run Code Online (Sandbox Code Playgroud)
链接电子邮件
<%= "#{link_to 'ACCEPT', lender_accept_email_url(borrow), method: :patch} or #{link_to 'DECLINE', lender_decline_email_url(borrow)}" %>
Run Code Online (Sandbox Code Playgroud)
链接网站仪表板
<%= "#{link_to 'ACCEPT', lender_accept_path(borrow), method: :patch} or #{link_to 'DECLINE', lender_decline_path(borrow), method: :patch}" %>
Run Code Online (Sandbox Code Playgroud)
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'
Run Code Online (Sandbox Code Playgroud)
梅勒观点:
<%="#{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"}" %>
Run Code Online (Sandbox Code Playgroud)
我在电子邮件上做了一个检查元素,只是为了确认button_to是否生成了相应的代码:
<form action="inventories/2037/decline" method="post" target="_blank" onsubmit="return window.confirm("You are submitting information to an external page.\nAre you sure?");"><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>
Run Code Online (Sandbox Code Playgroud)
在我的邮件设置中,我将主机正确设置为我的域名,所以当我收到电子邮件并单击按钮时,我会得到/inventories/2037/decline适当的,但我仍然会收到错误,因为显然日志说我还在尝试去找GET ......为什么?
2014-08-17T06:18:03.206205+00:00 app[web.1]: ActionController::RoutingError (No route matches [GET] "/inventories/2037/decline"):
Run Code Online (Sandbox Code Playgroud)
想知道是否有更好的方法吗?
使GET请求是理想的解决方案.不要使用任何其他请求.它可能不受电子邮件客户端的支持,并可能增加大的安全漏洞.
您错误地认为大型网站使用post/patch请求在电子邮件中执行此类操作.他们都使用get请求,它们包括一些令牌,当用户访问网站时,这些令牌被绑定/触发特定操作.
确定尝试了button_to生成一个POST表单,以避免使用GET进行POST,就像上面的"补丁"解决方案一样,仍然无法正常工作.
显然,它不会起作用.没有railsJavaScript文件.而且,即使你包括它也不会因为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'
Run Code Online (Sandbox Code Playgroud)
这是不好的.因为,get请求不适用updating/deleting.
因为,你想把它链接actions到你的email,你应该把dashboard链接与一些额外的参数.现在,accept/decline只要您看到传递给电子邮件的参数,JavaScript就会执行操作.
更多:
| 归档时间: |
|
| 查看次数: |
1543 次 |
| 最近记录: |