2014-01-17 39 views
2

葡萄中的多重路径参数如何在葡萄中工作?葡萄中的多重路线参数

我可以让这条路线的工作:

.../api/company/:cid 

但当我尝试这个办法:

.../api/company/:cid/members 
.../api/company/:cid/members/:mid 

我得到的错误。

下面是可用的代码。

resource 'company' do 
params do 
    optional :start_date, type: Date, desc: "Start date of range." 
    optional :end_date, type: Date, desc: "End date of range." 
end 
route_param :cid do 
    get do 
     {company_id: params[:cid]} 
    end 
end 
+1

您可以添加您遇到的问题吗?另外,产生这些错误的代码(假设你已经尝试了一些变化)。否则,我们会猜测可能是错的。葡萄绝对支持多个基于路由的参数。 –

回答

8
class API::Company < Grape::API 
    resource :company do 
    route_param :cid do 
     desc "GET" 
     params do 
      # your params 
     end 
     get '/' do # => '.../api/company/:cid 
      # process get 
     end 


     resources :members do 
      desc "GET" 
      params do 
      # your params 
      end 
      get '/' do # => '.../api/company/:cid/members/' 
      # process get 
      end 


      route_param :mid do 
      desc "GET" 
      params do 
       # your params 
      end 
      get '/' do # => '.../api/company/:cid/members/:mid' 
       # process get 
      end 
      end 
     end 
    end 
    end 
end 

你能做到这一点的方式。或者您可以创建两个不同的资源文件并将成员安装到公司。像这样:

# api/company.rb 
class API::Company < Grape::API 
    resource :company do 
    route_param :cid do 
     desc "GET" 
     params do 
      # your params 
     end 
     get '/' do # => '.../api/company/:cid 
      # process get 
     end 


     mount API::Members 
    end 
    end 
end 

# api/member.rb 
class API::Member < Grape::API 
    resources :members do 
    desc "GET" 
    params do 
     # your params 
    end 
    get '/' do # => '.../api/company/:cid/members/' 
     # process get 
    end 


    route_param :mid do 
    desc "GET" 
    params do 
     # your params 
    end 
    get '/' do # => '.../api/company/:cid/members/:mid' 
     # process get 
    end 
    end 
end 

希望帮助

1

另一种方法是使用正则表达式来验证标识。

resource 'company' :requirements => { :id => /[0-9]*/, :mid => /[0-9]*/ } do 

    get '/:id' do 
    # returns company 
    end 

    get ":id/members" do 
    members = Company.find_by_id(params[:id]).members 
    present members, :with => Members::MemberResponseEntity 
    end 

    get ":id/members/:mid" do 
    member = Member.find_by_id(params[:mid]) 
    present member, :with => Members::MemberResponseEntity 
    end 

end