葡萄中的多重路线参数

时间:2014-01-17 04:01:03

标签: ruby api grape

你如何在葡萄中获得葡萄多路线参数?

我可以让这条路线起作用:

.../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

2 个答案:

答案 0 :(得分:9)

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 :(得分:1)

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

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