Краткий ответ: Используйте request.env
или env
внутри контроллера.
Длинный ответ:
Согласно Руководство по Rails для контроллеров Rails , ActionController предоставляет метод request
, который можно использовать для доступа к информации о текущем HTTP-запросе, на который отвечает ваш контроллер.
После дальнейшей проверки документов на ActionController::Base#request
мы видим, что он «возвращает экземпляр ActionDispatch :: Request, представляющий текущий запрос».
Если мы посмотрим на документы для ActionDispatch::Request
, мы увидим, что он наследует от Rack::Request
. Ага! Вот и мы.
Теперь, если вы не знакомы с документами для Rack::Request
, это, по сути, оболочка для среды Rack. Так что в большинстве случаев вы должны использовать его как есть. Если вы действительно хотите использовать хэш в сырой среде, вы можете получить его с помощью Rack::Request#env
. Так что в контроллере Rails это будет просто request.env
.
Копать глубже:
После дальнейшего изучения методов экземпляра ActionController::Base
я заметил, что там не так много, чтобы посмотреть. В частности, я заметил, что переменные params
и session
, похоже, отсутствуют. Итак, я поднялся на один уровень до ActionController::Metal
, который ActionController::Base
наследуется от.
В ActionController::Metal
я обнаружил метод env
, в котором не было документации о том, что он сделал, - но я мог догадаться. Оказывается, я был прав. Эта переменная присваивалась request.env
.
ActionController::Metal
также содержал метод params
, который согласно источнику был установлен на request.parameters
по умолчанию. Оказывается, request.parameters
не из Rack::Request
, а ActionDispatch :: Http :: Parameters , который включается в ActionDispatch::Request
, Этот метод очень похож на метод Rack::Request#params
, за исключением того, что его изменение изменяет специфичную для Rails переменную среды Rack (и, следовательно, изменения останутся постоянными во всех случаях ActionDispatch::Request
) .
Однако я все еще не мог найти метод session
. Оказывается, его нет в документации вообще. После поиска исходного кода для ActionController::Metal
я наконец нашел его в этой строке . Это верно, это просто ярлык для request.session .
Подведем итог:
В контроллере ...
- Используйте
request.env
или env
, чтобы получить необработанный объект среды
- Используйте
params
для чтения строк запроса стойки и публикации данных из входного потока стойки. (Например, Rack::Request#params
)
- Используйте
session
для доступа к значению rack.session
в среде стойки
В промежуточном программном обеспечении ...