我想创建一个像href=contacts/create
这样的href标签。在我的contacts_controller中,我有一个创建GET操作。我知道这是针对rails惯例的。我仍然需要使用options = {controller=> 'contacts', action=>'create'}
创建上述链接。它适用于任何其他任意动作名称
答案 0 :(得分:3)
首先,这是GET requests should be idempotent以来的错误主意。你不仅仅是蔑视惯例 - 你自己和你的用户为非常糟糕的时间做好准备,因为例如按下后退和前进按钮将导致资源被创建 - 结束并结束。并且保证有更好的方法来解决你想要做的事情,例如:
# a "discrete form"
<%= button_to "Create contact", contacts_path, method: :post %>
# or use the rails ujs
<%= link_to "Create contact", contacts_path, method: :post %>
如果您绝对这样做:
Rails.application.routes.draw do
get "contacts/create"
end
您现在可以:
<%= link_to "Create", { controller: 'contacts', action: 'create' } %>
恭喜,你打破了互联网。
答案 1 :(得分:3)
您可以使用硬编码路径选项:
<%= link_to "Create", "contacts/create" %>
或Rails生成的路径选项:
<%= link_to "Create", { controller: "contacts", action: "create" } %>
这不仅仅是针对Rails&#39;约定,但反对声音HTTP使用。这通常会导致您无法提前预测的严重问题。网页抓取只是其中之一,只需抓取页面,Google僵尸网站就会在您的数据库中意外创建新的联系人。或者脚本小子,他们发现你有一个创建链接,并快速连续发送100,000次点击。
许多其他问题都是这样发生的,包括在一个众所周知的时间,谷歌浏览器从页面预先获取GET网址,以加快用户体验,并且#34 ;;使用这种技术的网站感觉到了这一点。这不是空闲警告或样式问题:这可能会对您的网站造成灾难性的影响。
答案 2 :(得分:0)
就像你提到的那样,这是针对rails约定的,但如果绝对必要,你可以从你的控制器执行此操作:
options = {controller=> 'contacts', action=>'create'}
view_context.link_to url_for(options)
如果你需要href只是路径,你可以这样做:
options = {controller=> 'contacts', action=>'create'}
view_context.link_to url_for(options.merge(only_path: true))