Ruby on rails rails中的路由-何时路由到crud方法以及何时使用给定参数路由

Ruby on rails rails中的路由-何时路由到crud方法以及何时使用给定参数路由,ruby-on-rails,ruby,routing,Ruby On Rails,Ruby,Routing,我需要一些关于在rails中布线的帮助。传统上,如果我在routes.rb中有路线 资源:类别 它将匹配www.website.com/categories/id,因为id是一个整数。但是,如果我想路由到一个特定的用户或类别,会发生什么呢 www.example.com/categories/apple 而不是传统的: www.example.com/categories/4 我目前在routes.rb中有这两行代码 匹配“类别/:名称”=>“类别#显示” 资源:类别 因此www.example

我需要一些关于在rails中布线的帮助。传统上,如果我在routes.rb中有路线

资源:类别

它将匹配www.website.com/categories/id,因为id是一个整数。但是,如果我想路由到一个特定的用户或类别,会发生什么呢

www.example.com/categories/apple

而不是传统的:

www.example.com/categories/4

我目前在routes.rb中有这两行代码

匹配“类别/:名称”=>“类别#显示”

资源:类别

因此www.example.com/categories/apple将正确路由到categories控制器中的show方法

但是

如果我想创建一个新类别怎么办?问题出在这里

www.example.com/categories/new

将路由到show方法,而不会路由到new方法

我可以在show方法中放置if语句checking is params[:name]==new,但是我觉得必须有更好的方法来解决这个问题

我的最终目标是基于类别字符串(apple)而不是基于它的ID(4)进行路由,但也能够创建、更新和销毁类别

有什么建议吗


谢谢

您可以将名称作为参数传递,例如,您可以尝试

链接到类别路径(category.name)
而不是
链接到类别路径(category)

它将转到categories#show in controller,路径看起来像example.com/categories/categorinName,在categories controller的show操作中,params[:id]将具有名称,您将需要如下内容

Category.find\u by_name params[:id]
而不是
Category.find params[:id]


希望这对您有所帮助。

正如@pdoherty926在评论中所说,您可以使用FriendlyId。如果要手动管理,不必覆盖路由,只需将所需代码放入
:show
操作:

class CategoriesControllers < ...
  ...

  def show
    if /^\d+$/ =~ params[:id]
      # ... normal workflow for integer id
    elsif /soe_regexp_that_matches_names>/
      # ... do your thing with names
    else
      raise 404
    end
  end

  ...
end
类别控制器
。。。 ... def秀 if/^\d+$/=~params[:id] # ... 整数id的正常工作流 匹配名称的elsif/soe\u regexp\u>/ # ... 用名字做你的事 其他的 提高404 结束 结束 ... 结束
我认为最简单的方法是,按照您的方式,在开始之前定义一条路线

match 'categories/:name' => 'categories#show'
像这样:

match 'categories/new' => 'categories#new'

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

秩序很重要

您是否考虑过使用Gem-like?afaik,match在rails 4中被弃用,并被相应的动词替换(在本例中为'get')@RobinR.Winton:shure,但我不知道rails的版本,示例使用的是
match
。所以我猜,这将是另一个rails版本。如果代码中有指向rails 4的提示。我错过了:)