我有一个受门卫保护的Grape API,我有一堆完美的方法。但是,有一种方法表现得很奇怪。 这是一个不需要参数的GET请求,并且运行它会引发以下错误:
在Grape :: Exceptions :: ValidationErrors id无效
我的方法如下:
desc 'Get all the cards of current customer'
params {}
get 'all' do
current_customer.discount_cards.to_json(include:
{
barcode: {
include: :barcode_type
}
})
end
日志说错误发生在logger.rb
文件的第17行,如下所示:
module API
class Logger
def initialize(app)
@app = app
end
def call(env)
payload = {
remote_addr: env['REMOTE_ADDR'],
request_method: env['REQUEST_METHOD'],
request_path: env['PATH_INFO'],
request_query: env['QUERY_STRING'],
x_organization: env['HTTP_X_ORGANIZATION']
}
ActiveSupport::Notifications.instrument 'grape.request', payload do
@app.call(env).tap do |response| # <-- logs say the error is here
payload[:params] = env['api.endpoint'].params.to_hash
payload[:params].delete('route_info')
payload[:params].delete('format')
payload[:response_status] = response[0]
end
end
end
end
end
我的主要base.rb
课程如下:
module API
class Dispatch < Grape::API
mount API::V1::Base
end
Base = Rack::Builder.new do
use API::Logger
run API::Dispatch
end
end
我真的无法理解它所讨论的id
,而且,所有其他api方法都可以正常工作(post,get,put,delete)。
你能帮我解决这个问题吗?
答案 0 :(得分:2)
我最近也遇到过这个问题,结果证明这是我的代码订单问题。我找到了答案here。
Grape按顺序评估路由,因此使用两个路由/:id和/ nearby_missions,它首先匹配/:id,使id = nearby_missions。然后它尝试将nearby_missions强制转换为失败的Integer,并且你得到了丢失的id错误。
你可以通过向第一条路线添加要求来解决这个问题:/ \ d * /(没有测试),但你可能最好按照你希望它们被评估的顺序对它们进行排序,就是你做的。
我的问题中没有足够的信息可以确定这也是你的问题,但很可能就是这样!