我正在使用 Grape redtful-api。我无法在 Grape 中继承 common_params。我定义了普通
_params 在类 API1 中并在 API2 中调用它会引发错误。如何更改代码以使其正常工作?

module Example
  class API1 < Grape::API
    version 'v1'
    format :json
    prefix :api

    resource :exc1 do
      common_params = proc do
        requires :param1
        requires :param2
      end

      params(&common_params)
      get :params_by_pair do
        p1 = params[:param1]
        p2 = params[:param2]
        response = "https://www.example1.com/#{p1}_#{p2}"
      end
    end
  end
end

module Example
  class API2 < API1
    version 'v1', using: :header, vendor: 'twitter'
    format :json
    prefix :api

    resource :exc2 do

      params(&common_params)
      get :params_by_pair do
        p1 = params[:param1]
        p2 = params[:param2]
        response = "https://www.example2.com/#{p1}_#{p2}"
      end
    end
  end
end

最佳答案

这个问题与 Grape 没有太大关系,而是与变量范围在 Ruby 中的工作方式有关。 common_params 只是一个局部变量,它不会在范围结束后继续存在。您可以通过使用类实例变量或 similar 使其工作,但我们不要去那里。您应该在不同的 Grape 中共享助手的方式是通过专用模块。

module Example
  module SharedHelpers
    extend Grape::API::Helpers

    params :common_params do
      requires :param1
      requires :param2
    end
  end
end

现在在不同的 Grape 中,您需要“包含”模块和 use 帮助程序。
module Example
  class API1 < Grape::API
    helpers SharedHelpers # !!!

    version 'v1'
    format :json
    prefix :api

    resource :exc1 do
      params do
        use :common_params # !!!
      end

      get :params_by_pair do
        ...
      end
    end
  end
end

要使用 API2 Grape 中的助手,请使用相同的技术。

关于ruby-on-rails - 继承在 Grape 中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27857555/

10-13 02:10