gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:31:09 24 4
gpt4 key购买 nike

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

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

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

如果 slug 被遗漏或不正确(由艺术家姓名计算), Controller 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 是指定?

最佳答案

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

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

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

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

关于ruby-on-rails - 如何让 Rails 路由助手始终使用 to_param 生成路径,即使我只是传入一个 ActiveRecord ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12188998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com