2016-05-16 49 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 –