我有什麼
我現在有喜歡使用路徑傭工非默認的屬性,而不是:ID
get 'book/:id' => 'books#show', as: :book
的代碼創建一個URL路徑是:
book_path @book
在控制器:
@book = Book.find(params[:id])
到現在爲止還挺好。現在,這個ID顯然是內部的ActiveRecord或數據庫主鍵。
我想要什麼
相反,我會(在這個例子虛構)使用書號代替。我可以這樣做:
get 'book/:isbn' => 'books#show', as: :book
book_path(isbn: @book.isbn)
@book = Book.find_by(isbn: params[:isbn])
這有點冗長;我希望在整個應用程序中使用這個模型的約定「isbn」,而且沒有人需要關心它。所以,我希望我的3條線看起來像這樣:
get 'book/:isbn' => 'books#show', as: :book
book_path @book # (!)
@book = Book.find(params[:isbn]) # (!)
是否可以配置路線以便我的願望成真?顯然,這應該自動工作無處不在,至少對於用戶在URL中看到ISBN的GET請求。
如果重要,#isbn
屬性不是通常意義上的主鍵,但可以保證表中只有一個特定ISBN的記錄。所以至少這部分主鍵合約已經完成。
你檢查了[to_param](https://apidock.com/rails/ActiveRecord/Integration/to_param)方法嗎? – Sajan
我沒有!謝謝,這很好,解決了兩者中更緊迫的問題。事後看來,我想我更喜歡'#find',所以堅持內部ID,反正。如果你創建一個迷你答案,你會得到我的接受。 – AnoE