gpt4 book ai didi

ruby-on-rails - Rails 中的漂亮路径

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

我有一个类别模型,我正在使用 resources :categories 的默认脚手架对其进行路由。我想知道是否有办法将路径从 /category/:id 更改为 /category/:name。我补充说:

match "/categories/:name" => "categories#show"

routes.rb 中的资源行上方,将 Controller 中的 show 操作更改为:

@category = Category.find_by_name(params[:name])

它可以工作,但是像 link_to some_category 这样的“魔法路径”仍然使用 :id 格式。

有没有办法做到这一点?如果这是一个坏主意(由于 rails 内部工作的某些可能方式),是否有另一种方法可以实现此目的?例如,/categories/music/categories/3 都可以吗?

最佳答案

Rails 有一个漂亮的模型实例方法,叫做 to_param,它就是路径所使用的。它默认为 id,但您可以覆盖它并生成如下内容:

class Category < ActiveRecord::Base
def to_param
name
end
end

cat = Category.find_by_name('music')
category_path(cat) # => "/categories/music"

有关更多信息,请查看 Rails documentation for to_param .

编辑:

当涉及到不适合 URL 的类别名称时,您有多种选择。一种是,正如您所说,在查找记录时,gsub 空格带有连字符,反之亦然。但是,更安全的选择是在类别表上创建另一个名为 name_param(或类似名称)的列。然后,您可以使用它代替所有路径和 URL 相关业务的名称。使用 parameterize 变形器创建 URL 安全字符串。以下是我的做法:

class Category < ActiveRecord::Base
after_save :create_name_param

def to_param
name_param
end

private
def create_name_param
self.name_param = name.parameterize
end
end

# Hypothetical
cat = Category.create(:name => 'My. Kewl. Category!!!')
category_path(cat) # => "/categories/my-kewl-category"

# Controller
@category = Category.find_by_name_param(param[:id]) # <Category id: 123, name: 'My. Kewl. Category!!!'>

关于ruby-on-rails - Rails 中的漂亮路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4732779/

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