1

因此,我正在为我的 rails 应用程序实现一个漂亮/SEO 友好的 URL 方案。我有一个名为 Artist 的模型,我希望 Railsartist_path助手始终生成友好版本的路径。

在我的 routes.rb 文件中,我有以下行:

  get 'artists/:id(/:slug)', :to => 'artists#show', :as => 'artist'

如果 slug 被遗漏或不正确(它由艺术家姓名计算),则控制器 301 重定向到正确的 URL。但是,出于 SEO 的原因,我想确保我网站内部的所有链接都具有正确的起始 URL。

Artist 模型具有以下两个(非常简单的)功能以使其工作:

  def slug
    name.parameterize
  end

  def to_param
    "#{id}/#{slug}"
  end

如果我artist_path用艺术家对象调用,这将按预期工作:

> app.artist_path(Artist.find 1234)
=> "/artists/1234/artist-name"

但是,当我只使用 ID 调用它时,它似乎根本没有使用 to_param:

> app.artist_path(id: 1234)
=> "/artists/1234"

tl;dr:如何强制 Rails 始终实例化对象并在调用to_param时调用它artist_path,即使只指定了 ID?

4

1 回答 1

2

据我所知,您所问的原因不起作用是因为当您将值传递给内置/自动 URL 帮助程序(如您的示例中的 ID)时,这些值只会得到用于在路由 URL 中“填空”。

如果您传递一个数组,则数组中的值将按顺序使用,直到 URL 被填写。如果您传递一个哈希,这些属性将被替换到 URL 中。一个对象,比如你的模型,将使用它的 to_param 方法来填充值......等等。

我理解您对“了解该模型的局限性”的担忧,但是,这种行为在 Rails 中是标准的,我不相信它真的会丢掉任何人。当您传入一个 ID 时,就像在您的示例中所做的那样,您并没有告诉 URL 帮助程序“使用此 ID 通过模型查找记录”,您只是告诉它“替换 ':id' 在带有您提供的 ID 的 URL 字符串。” 我相当确定内置的 URL 帮助程序甚至不知道如何查找记录 - 使用什么模型等 - 除了可能从路由/控制器名称推断。

我最好的建议是始终使用实例化的模型/记录。如果您希望 URL 帮助程序为您查找,那么就查询数据库而言,没有额外的开销。如果还有其他原因您想避免自己实例化记录,我很高兴听到它并可能提供其他建议。

于 2012-11-26T19:22:17.297 回答