Сеансы совместного использования приложений Rails + Sinatra - PullRequest
3 голосов
/ 04 февраля 2012

Я не нашел хорошего ответа на этот вопрос.Как я могу получить приложение Rails и приложение Sinatra (смонтированное в config.ru моего приложения Rails) для совместного использования сеанса?Если я сначала захожу в мое приложение Sinatra, а затем в приложение Rails, я получаю сообщение об ошибке типа undefined method sweep for {}:Hash, вероятно, потому, что Rails использует собственный подкласс Hash для хранения информации о сеансе, а Rack :: Session :: Cookie - нет.Мой код пока:

config.ru

map "/" do
  run MyRailsApp::Application
end

map "/sinatra" do
  use Rack::Session::Cookie, 
      key: "_app_session",
      secret: "<SECRET_KEY>"

  run MySinatraApp
end

config / initializers / session_store.rb

MyRailsApp::Application.config.session_store :cookie_store, key: '_app_session'

config / initializers / secret_token.rb

MyRailsApp::Application.config.secret_token = "<SECRET_KEY>" # same as config.ru

Что-нибудь, что я пропустил?

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Быстрый grep источника Rails показывает, sweep - это метод на ActionDispatch::Flash::FlashHash, который Rails хранит в сеансе под ключом flash.

Sinatra-Flash также использует ключ flash сеанса, но там хранится простой объект Hash.

Rails получает объект в session['flash'], то есть в Hash, поставленном Синатрой, предполагая, что это FlashHash и пытается вызвать sweep для него, отсюда сообщение об ошибке: undefined method sweep for {}:Hash.

Возможный обходной путь может заключаться в использовании другой клавиши в приложении Sinatra для флэш-памяти, а не по умолчанию (например, flash(:my_flash)[:error]="foo").

Это не поможет, если вы захотите использовать флэш-память для просмотра сообщений при переходе между Rails и Sinatra.

0 голосов
/ 20 августа 2014

Проблема "неопределенный метод очистки {}: Хэш" связана с тем, что ваш браузер хранит ранее кэшированные файлы cookie. Просто удалите куки, связанные с приложением, и обновите браузер. У меня это сработало.

...