2016-04-14 3 views
0

У меня есть API файл Синатры, который следующий код-доступ рубин Instance Переменный Включенного модуль

require 'json' 
require_relative 'api_logger' 

include ApiLogger 

get /myapi/:id 
request_params = request.env 
write_log('log message')  
end 

Тогда у меня есть модуль, содержащего

module ApiLogger 

def write_log(message) 
file.write(request['user']+message) 
end 

Но запрос методы «write_log'- [ 'user'] выходит пустым.

Вопрос в том, как получить доступ к переменной запроса из файла API Sinatra в модуле ApiLogger? Кроме того, я создаю объекты класса обслуживания из класса API и передаю им объект запроса при инициализации. Может ли модуль «ApiLogger» получить доступ к переменной экземпляра «запрос» из класса обслуживания, если классы обслуживания включают «ApiLogger»?

ответ

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 
+0

Да, объект 'request' является локальным для маршрутизации блоков (' get', 'Post' и другие Sinatra методов DSL), так это не видно снаружи. Самый чистый способ решить это - следовать этому ответу. – Kashyap

0

Я не хотел, чтобы передать объект запроса к каждому методу. Так что я сделал «request_params» глобальной переменным во всех классах, которые должны войти и добавил эту строку в «ApiLogger», чтобы получить значение запроса object-

request = instance_variable_get '@request_params' 
+0

Использование глобальной переменной, такой как очень плохая идея. Как только вы начнете использовать сервер, который может обрабатывать несколько запросов одновременно (понимайте многопоточность), вы столкнетесь с непонятными ошибками, потому что ваша глобальная переменная будет обновлена ​​вторым запросом, а первая будет работать. Я категорически против этого. –

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 
Смежные вопросы