【问题标题】:rails routes optional parameters types by :id or :namerails 通过 :id 或 :name 路由可选参数类型
【发布时间】:2012-09-20 18:41:13
【问题描述】:

场景: 我想要一个 url 路径,您可以在其中通过 :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 路径的正确设计决策。
寻求指导

【问题讨论】:

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


    【解决方案1】:

    我不认为你正在做的事情会起作用,因为你给出的路线是模棱两可的,因为 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 参数并以相同的方式在控制器中处理它来做到这一点。

    谢谢

    【讨论】:

    • 我认为关于模棱两可的反馈是正确的。我确实喜欢您提供的解决方案,但也许我需要重新考虑我的 URL 路径设计。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多