从包含的模块访问Ruby实例变量

时间:2016-04-14 00:41:51

标签: ruby sinatra

我有一个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'实例变量吗?

3 个答案:

答案 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