【问题标题】:Rails FriendlyId with URLs within URL带有 URL 内的 URL 的 Rails FriendlyId
【发布时间】:2024-01-16 08:17:01
【问题描述】:

我的应用缓存网页

在 pages#new 上,当您提交 URL(不带 http:// 前缀)时,会创建一个页面并将您重定向到节目,例如 pages/4,其中 4 是 ID

我正在尝试添加friendly_id,但在将extend FriendlyIdfriendly_id :url 添加到我的Page 模型后遇到了问题

如果我提供“yahoo.com”,重定向会转到 page/yahoo.com。 yahoo.com 被解释为{"id"=>"yahoo", "format"=>"com"} 而rails 告诉我Couldn't find Page with id=yahoo

如果我提供“yahoo.com/index.html”,重定向会转到 page/yahoo.com/index.html,但我只会得到 No route matches [GET] "/pages/yahoo.com/index.html"

你觉得我能怎么解决这个问题?

【问题讨论】:

    标签: ruby-on-rails friendly-id


    【解决方案1】:

    rails 路由中的句点表示格式(.json、.html、.csv 等)。为了让路由包含句点,您需要在您的config/routes.rb 文件中将路由上的format 选项设置为false。

    这个答案是从Disable :.format routes in rails3借来的。

    match '*pages' => 'pages#show', :format => false
    

    或者(足智多谋):

    constraints :format => // do
      resources :pages
    end
    

    至于friendly_id,您是否运行迁移以将:slug 列添加到Page 模型?

    对于您的示例,friendly_id 采用 :url 列,使其成为友好 URL,然后使用正确的 :slug 值更新您的 Page 实例。我怀疑friendly_id 可能会用下划线替换句点,但我没有验证这一点。

    如果您不想使用 :slug 列并且您已经有一个 :url 列,那么您需要这样定义它:

    friendly_id :url, use: [:slugged], slug_column: :url
    

    ...具体来说,slug_column 参数。

    【讨论】:

    • 谢谢。我在我的Page 模型中覆盖了normalize_friendly_id,所以它什么也不做(因为我希望我的网址像/page/apple.com,而不是/page/apple-com - 我使用的是资源丰富的路由版本,但它没有t 似乎工作正常,由于某种原因,我再次收到 GET 错误