Доступ к имени cookie "сеансового ключа" из любого места в Rails
Мы создаем плагин для Rails, который будет использоваться в приложениях iframe Facebook, и в какой-то момент нам нужно проверить, был ли установлен файл cookie идентификатора рейса, или нет.
По умолчанию этот файл cookie называется _myprojectname_session, нам нужно узнать фактическое имя самого файла cookie. Поэтому, если он не установлен, мы можем сделать некоторые переадресации, чтобы убедиться, что файлы cookie установлены.
Как нам получить доступ к проклятому имени файла cookie из любого места? Или, по крайней мере, изнутри контроллера?
Ответы
Ответ 1
Я нашел решение. В Rails 2.3.2 по крайней мере ключ сеанса, установленный в config/initializers/session_store.rb
, как это:
ActionController::Base.session = {
:key => '_myapp_session',
:secret => '[...]'
}
И вы можете прочитать значение, подобное этому:
ActionController::Base.session_options[:key]
От Base.session
до Base.session_options
автоматически, не имеет большого смысла, и это вызвало у меня большую головную боль... lol
Ответ 2
Rails.application.config.session_options[:key]
Ответ 3
Чтобы получить доступ к имени файла cookie сеанса из представления или контроллера, вы можете сказать:
request.session_options[:session_key]
а затем для доступа к необработанному значению этого файла cookie, являющегося пустым массивом, если он не установлен, вы используете:
request.cookies[ request.session_options[:session_key] ]
Имя файла cookie (aka session_key) устанавливается в файле config/environment.rb
.
config.action_controller.session = {
:session_key => '_project_session',
:secret => 'long-secret-key'
}
Ответ 4
По моему опыту, если в ключе есть символ подчеркивания, IE SOMETIMES не устанавливает файлы cookie. Другими словами, используйте "projectession" вместо "_project_session".
Ответ 5
Я думаю, что ключ сеанса хранится в переменной ENV_SESSION_KEY
Ответ 6
Обратите внимание также на эту ошибку, которая влияет на тесты вокруг session_options в некоторых версиях Rails 2.x: https://rails.lighthouseapp.com/projects/8994/tickets/2303-testrequest-doesnt-initialize-session_options
Ответ 7
В Rails 3/4 я использую это:
request.env["rack.request.cookie_hash"]
Это хэш, содержащий все файлы cookie для текущего пользователя, в том числе и для сеанса.
Хэш имеет в качестве ключа имя файла cookie, а в качестве значения значение cookie
Ответ 8
Я не мог понять, как это сделать в рельсах 3: - (
В конце концов я положил это в config/initializers/session_store.rb
SESSION_KEY = '_myapp_session'
MyApp::Application.config.session_store :cookie_store, :key => SESSION_KEY
а затем доступ к нему, если это необходимо, например, в представлении...
<%= ::ENV_SESSION_KEY %>