我想创建一个类似href=contacts/create
的href标记。在我的contacts_controller中,我有一个createGET操作。我知道这是违反铁路惯例的。我仍然需要使用options = {controller=> 'contacts', action=>'create'}
创建上面的链接。它适用于任何其他任意操作名称
您可以选择硬编码路径选项:
<%= link_to "Create", "contacts/create" %>
或者Rails生成的路径选项:
<%= link_to "Create", { controller: "contacts", action: "create" } %>
这不仅违反了Rails的惯例,也违反了声音HTTP的使用。这通常会导致无法提前预测的严重问题。网络爬行只是其中之一,类似谷歌机器人的东西只是通过爬行页面,意外地在你的数据库中创建了一个新的联系人。或者给那些发现你有一个创建链接的孩子写脚本,然后快速连续点击10万次。
许多其他问题也会像这样发生,包括在一个众所周知的时刻,谷歌Chrome从页面中预取GET URL以"加快用户体验";使用过这种技术的网站都能感受到这一点。这不是一个闲置的警告或风格问题:这可能会对您的网站产生灾难性的影响。
首先,这真的是个坏主意,因为GET请求应该是幂等的。你不仅仅是在藐视惯例,你还在为自己和用户设置一个非常糟糕的时间,因为例如按下后退和前进按钮会导致资源被一次又一次地创建。而且有一种更好的方法可以解决你想做的事情,比如:
# 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' } %>
祝贺你,你打破了互联网。
正如您所提到的,这违反了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))