在rails中路由 - 何时路由到crud方法以及何时使用给定参数进行路由

时间:2013-11-16 20:56:31

标签: ruby-on-rails ruby routing

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

  

资源:类别

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

  

www.example.com/categories/apple

而不是传统的:

  

www.example.com/categories/4

我目前在我的routes.rb

中有这两行
  

匹配'categories /:name'=> '类别#秀'

     

资源:类别

所以www.example.com/categories/apple会正确地路由到类别控制器中的show方法。

如果我想创建新类别怎么办?这是问题

  

www.example.com/categories/new

将路由到 show 方法,并且不会路由到方法

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

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

任何提示?

谢谢!

3 个答案:

答案 0 :(得分:0)

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

link_to category_path(category.name)代替link_to category_path(category)

它将转到控制器中显示的类别#stow,路线看起来像example.com/categories/categoryName,在你的cateogries控制器的show动作中,params [:id]将有你的名字,你需要

之类的东西

Category.find_by_name params[:id]代替Category.find params[:id]

希望这会对你有所帮助。

答案 1 :(得分:0)

正如@ 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

答案 2 :(得分:0)

我认为按照自己的方式执行此操作的最简单方法是在

之前定义路线
match 'categories/:name' => 'categories#show'
像这样:

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

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

订单很重要。