Ruby on rails 轨道上的漂亮小径

Ruby on rails 轨道上的漂亮小径,ruby-on-rails,routing,seo,Ruby On Rails,Routing,Seo,我有一个类别模型,我使用默认的resources:categories:categories框架对其进行路由。我想知道是否有办法将路径从/category/:id更改为/category/:name。我补充说: match "/categories/:name" => "categories#show" 在routes.rb中的资源行上方,并将控制器中的show操作更改为: @category = Category.find_by_name(params[:name]) 它是有效的,但

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

match "/categories/:name" => "categories#show"
routes.rb中的资源行上方,并将控制器中的
show
操作更改为:

@category = Category.find_by_name(params[:name])
它是有效的,但是像
链接到某个类别
这样的“神奇路径”仍然使用
: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"

如果您不想破坏依赖于模型id的现有代码,您可以这样定义to_参数:

 def to_param
   "#{id}-#{name}"
 end
因此,您的url将是:并且您仍然可以使用model.find(params[:id])加载您的模型,因为:

“123你好,世界”,致 =>123


尽管可能比您需要的更多,但您可能还希望了解“人类可读URL”支持,如友好id或其他描述的支持(例如,如果您需要unicode支持等)。

非常感谢!我忘了这件事!您是否知道处理类别中的空格的好方法?例如,一个类别“两个词”,使其成为url中的“两个词”?这是否意味着我需要对_paramname.gsub(“,”-”)进行修改,然后每次我想通过_name查找_时,我都会做同样的事情?参数[:名称].gsub(“-”和“”)?我该如何重写我的匹配模式呢?我发现rails中有一种方法应该比我所想的gsub'ing更好。哇,非常感谢Voncorad,这很有意义。我真的很感谢你的帮助!
 def to_param
   "#{id}-#{name}"
 end