簡體   English   中英

帶有 Ruby on Rails 路由的短網址

[英]Short url with Ruby on Rails routes

我正在嘗試為 Ruby on Rails 中的書籍創建短 url 鏈接。 我想得到這樣的東西: www.domain.com/book123 ,其中book是控制器名稱(或自定義控制器名稱), 123是這本書的 ID。

現在我的路線如下:

resources :books, except: [:edit], path: "book" do
  put :new, on: :new
  member do
    get ':id'           => 'books#show'
    get 'general'       => 'books#general'
    get 'additional'    => 'books#additional'
    get 'photos'        => 'books#photos'
    get 'map'           => 'books#map'
  end
  resources :photos, only: [:create, :destroy]
end

這就是我得到的: http://localhost:3000/book/40www.domain.com/book/40

我試圖找到類似的問題,我發現實現這一目標的唯一方法是使用正則表達式。 我是 Ruby on Rails 的新手,我想找到正確有效的方法。

另外,我可能是錯的,但我注意到某些 url 會影響網站性能,所以我不想遇到這樣的問題。

任何幫助、信息或示例將不勝感激。 感謝您的幫助和時間。

你可以試試這條路線:

get 'book*id' => 'bookscontroller#show'

查看這篇文章: https : //www.railsmine.net/2014/10/route-globbing-in-ruby-on-rails.html

正如@qdx47 所提到的,您最好遵循約定,但如果您不能這樣做,我認為您可以在書籍模型上覆蓋to_param ,例如:

 def to_param
  "book#{id}"
 end

然后定義路由

get ':id', to: 'books#show', constraints => { :book_id => /book[0-9]+/ }

我想你可以試試下面的 gem。

友好的身份寶石

然后您將能夠生成可以是任何唯一字符串的 slug。 默認情況下它將是 uuid 但您可以覆蓋它。 遵循 gem 文檔。 它將允許您生成像http://localhost:3000/books/book123 這樣的路由

一般而言,我認為您以這種方式格式化您的路線會違反慣例和最佳實踐。

有了這個警告,您應該能夠像這樣定義路由:

get(':book_id', 'books#show', constraints => { :book_id => /book[0-9]+/ })

然后,您需要從控制器中的“書”文字中提取 id。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM