3

How do you get multiple route params in Grape to work in grape?

I can make this route work:

.../api/company/:cid

But when I try this:

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

I get errors.

Here's the code that works.

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
gojohnnygo
  • 1,148
  • 1
  • 10
  • 13
  • 1
    Could you add the errors you get to the question? In addition, the code that produces those errors (assuming you've tried a few variations). Otherwise we are left guessing what might be wrong. Grape definitely supports multiple route-based params. – Neil Slater Jan 17 '14 at 10:07

2 Answers2

10
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

You can do that that way. Or you can create two different resources file and mount Members to Company. Like so:

# 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

Hope that helps

Sam Corder
  • 5,374
  • 3
  • 25
  • 30
RantriX
  • 1,017
  • 1
  • 10
  • 18
1

Another way to do that is using a regexp to validate the ids.

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
halbano
  • 1,135
  • 14
  • 34