如何使用link_to和action创建一个href标记'创建'

时间:2016-05-16 23:15:53

标签: ruby-on-rails ruby

我想创建一个像href=contacts/create这样的href标签。在我的contacts_controller中,我有一个创建GET操作。我知道这是针对rails惯例的。我仍然需要使用options = {controller=> 'contacts', action=>'create'}创建上述链接。它适用于任何其他任意动作名称

3 个答案:

答案 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))