代码之家  ›  专栏  ›  技术社区  ›  Anton S.

使用Ruby on Rails路由的短url

  •  2
  • Anton S.  · 技术社区  · 7 年前

    我正在尝试为RubyonRails中的书籍创建短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/40 www.domain.com/book/40 .

    我试图找到类似的问题,我发现实现这一点的唯一方法是使用regex。我是RubyonRails的新手,我想找到正确有效的方法。

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

    我们将非常感谢您提供的任何帮助、信息或示例。谢谢你的帮助和时间。

    4 回复  |  直到 7 年前
        1
  •  1
  •   Pablo    7 年前

    您可以尝试以下路线:

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

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

        2
  •  1
  •   Leaf    7 年前

    正如@qdx47所提到的,您最好遵循约定,但如果您不能这样做,我认为您可以重写 to_param 在书本模型上,例如:

     def to_param
      "book#{id}"
     end
    

    然后定义管线,如

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

        3
  •  1
  •   Prince Bansal    7 年前

    我想你可以试试看。

    Friendly Id Gem

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

        4
  •  0
  •   qdx47    7 年前

    总的来说,我认为以这种方式格式化路线是违反惯例和最佳做法的。

    有了这个警告,您应该能够这样定义一条路线:

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

    然后需要从控制器中的“book”文本中提取id。