2016-05-16 126 views
0

我想创建一个href标记,如href=contacts/create。在我的contacts_controller中,我有一个创建GET操作。我知道这是违反铁轨惯例。我仍然需要使用options = {controller=> 'contacts', action=>'create'}创建上述链接。它适用于任何其他任意行为的名字如何使用link_to创建href标记并创建动作

回答

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)) 
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' } %> 

恭喜你,你打破了互联网。

+2

哈哈“祝贺你打破了互联网”我喜欢那个:D – medBo

+1

不幸的是它是遗留代码!有人已经做了一些真正的好工作:( –

3

您可以硬编码的路径选择:

<%= link_to "Create", "contacts/create" %> 

或Rails的生成路径选项:

<%= link_to "Create", { controller: "contacts", action: "create" } %> 

这不仅是对Rails的约定,但反对的声音HTTP使用。这往往会造成严重的问题,您无法事先预测。网络爬虫只是其中之一,只需通过抓取页面,Google Bot就会在数据库中意外创建一个新联系人。或者脚本小子发现你有一个创建链接,并且连续发送10万次点击。

许多其他问题都会发生,包括在一个众所周知的时间,谷歌浏览器预先从页面获取GET URL以“加速用户体验”;这被使用这种技术的网站感受到了很多。这不是一个空闲警告或风格问题:这可能会对您的网站造成灾难性的影响。

+0

@yatishmehta如果这已经回答了您的问题,请点击答案旁边的复选标记以接受它。选中标记将变为绿色。Upvotes也总是被赞赏:D –