【问题标题】:Short url with Ruby on Rails routesRuby on Rails 路由的短网址
【发布时间】:2018-02-15 17:48:41
【问题描述】:

我正在尝试为 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 会影响网站性能,所以我不想遇到这样的问题。

我们将不胜感激任何帮助、信息或示例。感谢您的帮助和时间。

【问题讨论】:

标签: ruby-on-rails ruby routes


【解决方案1】:

你可以试试这条路线:

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

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

【讨论】:

  • 也许我做错了什么,但它根本不会改变路线。非常感谢您的帮助,无论如何我都会阅读这篇文章:)
【解决方案2】:

正如@qdx47 提到的,您最好遵守约定,但如果您不能这样做,我认为您可以在图书模型上覆盖to_param,例如:

 def to_param
  "book#{id}"
 end

然后像

这样定义路由

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

【讨论】:

    【解决方案3】:

    我觉得你可以试试下面的 gem。

    Friendly Id Gem

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

    【讨论】:

    【解决方案4】:

    一般来说,我认为您以这种方式格式化您的路线会违反惯例和最佳实践。

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

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

    然后您需要从控制器中的“书”字面量中提取 id。

    【讨论】:

    • 这个答案似乎是正确的,但我收到一个错误:LocalJumpError, no block given (yield)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2018-12-28
    相关资源
    最近更新 更多