Сводка
В веб-приложении Sinatra как я могу сделать виртуальный запрос к приложению и вернуть тело ответа в виде текста?Например, эти маршруты ...
get('/foo'){ "foo" }
get('/bar'){ "#{spoof_request '/foo'} - bar" }
... должны приводить к ответу "foo - bar" при запросе "/ bar" через веб-браузер.
Мотивация
У моего приложения есть страница, представляющая запись об ошибке, с большим количеством деталей об этой ошибке: в какой версии была ошибка, в какой степени она важна, какие теги связаны с ней, кому назначена ошибка,и т.д.
Пользователь может редактировать отдельные фрагменты данных на этой странице в интерактивном режиме.Используя мой AJAXFetch jQuery плагин, JavaScript использует AJAX для замены раздела страницы, предназначенного только для чтения (например, имя человека, которому назначена эта ошибка), с частичной формой HTML для редактирования только этого раздела,Пользователь отправляет форму, и AJAX делает новый запрос для статической версии этого поля.
Чтобы быть DRY , я хочу, чтобы представление Haml, создающее страницу, использовалоТочно такой же запрос, который AJAX делает при создании отдельных статических частей.Например:
#notifications.section
%h2 Email me if someone...
.section-body= spoof_request "/partial/notifications/#{@bug.id}"
Не совсем рабочий код
Следующий помощник, определяющий spoof_request
, работал под Sinatra 1.1.2:
PATH_VARS = %w[ REQUEST_PATH PATH_INFO REQUEST_URI ]
def spoof_request( uri, headers=nil )
new_env = env.dup
PATH_VARS.each{ |k| new_env[k] = uri.to_s }
new_env.merge!(headers) if headers
call( new_env ).last.join
end
Под Sinatra 1.2.3, однако, это больше не работает.Несмотря на установку каждого из PATH_VARS
в желаемый URI, call( new_env )
все еще заставляет Sinatra обрабатывать маршрут для текущего запроса, а не для указанного пути.(Это приводит к бесконечной рекурсии, пока уровень стека, наконец, не достигнет нижнего уровня.)
Этот вопрос отличается от Вызов Синатры изнутри Синатры , поскольку принятый ответ на этот (старый) вопросне поддерживать сеанс пользователя.