2016-04-30 19 views
0

我正在開發我的第一個軌道應用程序。我通過了Rails Routing from the Outside In 文檔,但無法弄清楚如何設置下面的路線。軌道路線 - 用連字符替換空格的ID和名稱

我有一個ClientsController和顯示操作我想顯示客戶端的名字和空格替換爲連字符,在URL中。

取而代之的是以下

本地主機:3000 /客戶/ 1

的鏈接應該是(名字:約翰,姓氏:DOE)

本地主機:3000 /客戶/ 1/john-doe

回答

1

此處的策略是將URL中的名稱視爲丟棄變量,因爲它不被用作標識符。注意,在StackOverflow中,你可以輸入任何你想要的名字,只要這個ID是正確的,你就會得到你想要的頁面。因此,我們可以做到這一點:

  1. 定義使用resources :clients,所以你可以去/clients/1
  2. 定義另一條路線get 'clients/:id/:name', to: 'clients#show', as: :client_name正常路線。這可以讓你去/clients/1/anything-you-want,它會在ClientsControllerid: 1name: "anything-you-want"擊中show行動。
  3. 定義從用戶名中生成url-name的方法。爲了簡單起見,我假設你已經定義了User#url_name,但在助手中定義url_name(client)可能更有意義,因爲它與模型無關。
  4. 在您的應用中,使用client_name_path(@client.id, @client.url_name);例如,client_name_path(1, "john-doe")。這個網址幫助名稱由我們選擇在路線中使用as: :client_name來定義。這次調用的返回值應該是「/ clients/1/john-doe」,我們已經發送到ClientsController#show操作。

到目前爲止,在您的應用程序的鏈接就會有正確的URL,但用戶仍然可以在URL中鍵入任何名字,它會在地址欄(即使頁面就可以了)依然存在。如果你想更進一步,像StackOverflow,並實際上更改網址爲正確的名稱,你可以嘗試在ClientsController#show,到redirect_to client_name_path(@client.id, @client.url_name) if params[:name] != @client.url_name。只要小心,不要陷入無限循環。

+0

謝謝..這是很好和簡單的方法。 – ZedBee

0

你不能在導軌中開箱即用。但你可以實現,使用friendly_id寶石

1

我想你的意思是localhost:3000/clients/john-doe不是localhost:3000/clients/1/john-doe? (在後一種情況下,/1/將是多餘的)。

您的第一個選擇是在User模型中定義to_param方法。您需要返回參數的開始你的模型ID:

def to_param 
    [id, first_name, last_name].join("-") 
end 

User.find_by(last_name: "doe").to_param # => 1-john-doe 

如果你真的不想要你的用戶模型中的ID,然後再考慮使用友好的ID寶石:https://github.com/norman/friendly_id

我然而,請注意不要在您的路線中使用first-last作爲標識符。首先,如果你有兩個用戶姓名相同(最終會發生),會發生什麼?其次,如果你的用戶有不尋常的名字,比如那些帶有空格或撇號的名字(例如「O'neill」等)?你總是可以對這種情況進行URL編碼,但它看起來不會很漂亮。

+0

+1 ..謝謝你的詳細回答。第一個和最後一個是爲了使網址seo友好,就像stackoverflow正在做的一樣,url中的id就是標識符。 – ZedBee