我有一个Sinatra API文件,其中包含以下代码 -
require 'json'
require_relative 'api_logger'
include ApiLogger
get /myapi/:id
request_params = request.env
write_log('log message')
end
然后我有一个包含方法'write_log' -
的模块module ApiLogger
def write_log(message)
file.write(request['user']+message)
end
但请求['user']空白。
所以问题是如何从ApiLogger模块中的Sinatra API文件访问请求变量?此外,我正在从API类创建服务类对象,并在初始化时传递它们的请求对象。如果服务类只包含'ApiLogger',模块'ApiLogger'可以从服务类访问'request'实例变量吗?
答案 0 :(得分:2)
您可以将其作为附加参数传递。 类似的东西:
require 'json'
require_relative '../../lib/helpers/api_logger'
include ApiLogger
get /myapi/:id
request_params = request.env
write_json_log('log message', request)
end
和
def write_json_log(message, request)
file.write(request['auth_subject']+message)
end
答案 1 :(得分:0)
我不想将请求对象传递给每个方法。所以我做了'request_params'所有类中的全局变量,需要记录并在ApiLogger'中添加此行。获取请求对象的值 -
body
答案 2 :(得分:0)
您几乎就在那里,您需要的只是将您的模块包含在帮助程序中,以便直接访问请求对象。以下是代码的略微修改版本,作为独立程序运行:
require 'sinatra'
module ApiLogger
def write_log(message)
$stdout.write(request.env['sinatra.route'] + message)
end
end
helpers do
include ApiLogger
end
get '/test' do
write_log('log message')
'ok'
end