我正在尝试在Ruby on Rails中为书籍创建短网址链接。我希望得到这样的结果: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/40
或www.domain.com/book/40
。
我试图找到类似的问题,我发现实现这一目标的唯一方法是使用正则表达式。我是Ruby on Rails的新手,我想找到合适而有效的方法。
另外,我可能错了,但我注意到一些网址会影响网站的性能,所以我不想有这样的问题。
任何帮助,信息或示例都将受到高度赞赏。感谢您的帮助和时间。
答案 0 :(得分:1)
你可以尝试这条路线:
get 'book*id' => 'bookscontroller#show'
查看此文章:https://www.railsmine.net/2014/10/route-globbing-in-ruby-on-rails.html
答案 1 :(得分:0)
一般情况下,我认为通过以这种方式格式化您的路线,您将违反惯例和最佳做法。
有了这个警告,你应该能够像这样定义一条路线:
get(':book_id', 'books#show', constraints => { :book_id => /book[0-9]+/ })
然后,您需要从控制器中的“book”文字中提取id。
答案 2 :(得分:0)
正如@ qdx47提到你最好遵循惯例,但如果你不能,我认为你可以覆盖书模型上的to_param
,如:
def to_param
"book#{id}"
end
然后定义像
这样的路线 get ':id', to: 'books#show', constraints => { :book_id => /book[0-9]+/ }
答案 3 :(得分:0)
我认为你可以尝试下面的宝石。
然后您将能够生成可以是任何唯一字符串的slug。默认情况下,它将是uuid,但您可以覆盖它。关注gem文档。它将允许您生成http://localhost:3000/books/book123等路线。