Rails - 葡萄验证错误

Rails - Grape validations error

我在将应用程序从 Rails 4 更新到 Rails 5.0.2 时遇到问题 当我尝试时出现此错误:

/projects/tx/app/api/api_v2/validations.rb:3:in `<module:Validations>': uninitialized constant Grape::Validations::Validator (NameError)
    from /projects/tx/app/api/api_v2/validations.rb:2:in `<module:APIv2>'
    from /projects/tx/app/api/api_v2/validations.rb:1:in `<top (required)>'
    from /projects/tx/app/api/api_v2/deposits.rb:1:in `require_relative'
    from /projects/tx/app/api/api_v2/deposits.rb:1:in `<top (required)>'

尝试为此寻找解决方案,但根本没有成功。也许葡萄改变了一些命名。 validations.rb 中的代码如下所示:

module APIv2
  module Validations
    class Range < ::Grape::Validations::Validator

      def initialize(attrs, options, required, scope)
        @range    = options
        @required = required
        super
      end

      def validate_param!(attr_name, params)
        if (params[attr_name] || @required) && !@range.cover?(params[attr_name])
          raise Grape::Exceptions::Validation, param: @scope.full_name(attr_name), message: "must be in range: #{@range}"
        end
      end

    end
  end
end

文件deposits.rb是这样的:

require_relative 'validations'

module APIv2
  class Deposits < Grape::API
    helpers ::APIv2::NamedParams

    before { authenticate! }

    desc 'Get your deposits history.'
    params do
      use :auth
      optional :currency, type: String, values: Currency.all.map(&:code), desc: "Currency value contains  #{Currency.all.map(&:code).join(',')}"
      optional :limit, type: Integer, range: 1..100, default: 3, desc: "Set result limit."
      optional :state, type: String, values: Deposit::STATES.map(&:to_s)
    end
    get "/deposits" do
      deposits = current_user.deposits.limit(params[:limit]).recent
      deposits = deposits.with_currency(params[:currency]) if params[:currency]
      deposits = deposits.with_aasm_state(params[:state]) if params[:state].present?

      present deposits, with: APIv2::Entities::Deposit
    end

    desc 'Get details of specific deposit.'
    params do
      use :auth
      requires :txid
    end
    get "/deposit" do
      deposit = current_user.deposits.find_by(txid: params[:txid])
      raise DepositByTxidNotFoundError, params[:txid] unless deposit

      present deposit, with: APIv2::Entities::Deposit
    end

    desc 'Where to deposit. The address field could be empty when a new address is generating (e.g. for bitcoin), you should try again later in that case.'
    params do
      use :auth
      requires :currency, type: String, values: Currency.all.map(&:code), desc: "The account to which you want to deposit. Available values: #{Currency.all.map(&:code).join(', ')}"
    end
    get "/deposit_address" do
      current_user.ac(params[:currency]).payment_address.to_json
    end
  end
end

你可以找到原因here, and you can find initial method signature here

改变validations.rb

module APIv2
  module Validations
    class Range < ::Grape::Validations::Validator

      def initialize(attrs, options, required, scope, opts = {})
        @range    = options
        @required = required
        super
      end

      def validate_param!(attr_name, params)
        if (params[attr_name] || @required) && !@range.cover?(params[attr_name])
          raise Grape::Exceptions::Validation, param: @scope.full_name(attr_name), message: "must be in range: #{@range}"
        end
      end

    end
  end
end