如何使用link_to和操作"创建"创建 href 标记



我想创建一个类似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))

最新更新