rails路由可选参数类型:id或:name

时间:2012-09-20 18:41:14

标签: ruby-on-rails-3 url testing routes custom-routes

方案: 我希望有一个网址路径,您可以通过:id:name:查找某人。 对于user/5/user/tom,所有人都指向同一个用户

routes.rb

controller 'user' do  
    get 'user/:id'  
    get 'user/:name'  
end 

test / routes / user_routes.rb

test "/user/:id" do  
  assert_routing "/user/5", :controller => "user", :action => "find_by_id", :id=>"5"  
end  

test "/user/:name" do  
  assert_routing "/user/tom", :controller => "user", :action => "find_by_name", :name=>"tom"  
end 

我不确定这是否是使用URL路径的正确设计决策 寻求指导

1 个答案:

答案 0 :(得分:2)

我不认为你在做什么会起作用,因为你提供的路线是不明确的,因为rails路线不能说像user / 15这样的url有名字或id。

当然,有一种方法可以通过指定正则表达式来实现。由于id始终是一个数字,我们可以对它进行正则表达式检查

controller 'user' do  
    get 'user/:id', :id => /\d+/
    get 'user/:name', :name => /[A-Za-z][\w\s]+/
end 

以上陈述提出了正则表达式的约束。在您的控制器中,您可以检查

if params[:id]
# Get by id
else
# Get by name

您也可以通过传递get参数并以相同的方式在控制器中处理它来完成此操作。

由于