Ruby on Rails路线的短网址

时间:2018-02-15 17:48:42

标签: ruby-on-rails ruby routes

我正在尝试在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/40www.domain.com/book/40

我试图找到类似的问题,我发现实现这一目标的唯一方法是使用正则表达式。我是Ruby on Rails的新手,我想找到合适而有效的方法。

另外,我可能错了,但我注意到一些网址会影响网站的性能,所以我不想有这样的问题。

任何帮助,信息或示例都将受到高度赞赏。感谢您的帮助和时间。

4 个答案:

答案 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)

我认为你可以尝试下面的宝石。

Friendly Id Gem

然后您将能够生成可以是任何唯一字符串的slug。默认情况下,它将是uuid,但您可以覆盖它。关注gem文档。它将允许您生成http://localhost:3000/books/book123等路线。