如何让 rails 路由助手始终使用 to_param 生成路径,即使我只是传入 ActiveRecord ID?

Posted

技术标签:

【中文标题】如何让 rails 路由助手始终使用 to_param 生成路径,即使我只是传入 ActiveRecord ID?【英文标题】:How can I make rails route helpers always use to_param to generate the path, even when I just pass in an ActiveRecord ID? 【发布时间】:2012-08-24 17:11:38 【问题描述】:

所以,我正在为我的 rails 应用程序实现一个漂亮/SEO 友好的 URL 方案。我有一个名为 Artist 的模型,我希望 Rails artist_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 在调用 artist_path 时始终实例化对象并在其上调用 to_param,即使只指定了 ID?

【问题讨论】:

我刚刚发现了这个gist,它承认路由助手的这种行为,但只说(释义)“只是不要只用 id 调用助手”。这是解决方案吗?我希望不会,因为我不想要开发者to have to know of any limitation specific to this model。 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于如何让 rails 路由助手始终使用 to_param 生成路径,即使我只是传入 ActiveRecord ID?的主要内容,如果未能解决你的问题,请参考以下文章

Rails:如何访问 RESTful 助手?

如何将 Rails 视图助手提取到 gem 中?

Rails - 如何向 url 助手添加格式?

如何从控制器路由 Rails 4 获得不同的和多个视图

资产管道中的路由助手

Rails 3. 如何添加 ActiveAdmin 将使用的助手?