gojohnnygo
gojohnnygo

Reputation: 1158

Multiple Route Params in Grape

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

Upvotes: 3

Views: 4190

Answers (2)

halbano
halbano

Reputation: 1305

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

Upvotes: 1

RantriX
RantriX

Reputation: 1027

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

Upvotes: 10

Related Questions