【问题标题】:Multiple Route Params in Grape葡萄中的多个路由参数
【发布时间】:2014-01-17 04:01:03
【问题描述】:

如何让 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

【问题讨论】:

  • 您能否将您遇到的错误添加到问题中?此外,产生这些错误的代码(假设您已经尝试了一些变体)。否则,我们只能猜测可能出了什么问题。 Grape 绝对支持多个基于路由的参数。

标签: ruby api grape


【解决方案1】:
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

希望有帮助

【讨论】:

    【解决方案2】:

    另一种方法是使用正则表达式来验证 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
    

    【讨论】:

      猜你喜欢
      • 2015-06-13
      • 1970-01-01
      • 2016-01-21
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多