我需要一些关于路由选择的帮助。传统上,如果我在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),但也能够创建,更新和销毁类别。
任何提示?
谢谢!
答案 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'
订单很重要。