Rails + Sinatra应用程序共享会话

时间:2012-02-03 20:44:30

标签: ruby-on-rails ruby session cookies sinatra

我还没有找到一个好的答案。如何才能将我的Rails应用程序和Sinatra应用程序(安装在我的Rails应用程序的config.ru中)成功共享会话?如果我首先访问我的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

配置/初始化/ session_store.rb

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

配置/初始化/ secret_token.rb

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

我错过了什么?

2 个答案:

答案 0 :(得分:4)

Rails源代码的快速grep显示sweepActionDispatch::Flash::FlashHash上的一种方法,Rails会在flash密钥下的会话中存储。

Sinatra-Flash也使用会话的flash密钥,但它在那里存储了一个普通的Hash对象。

Rails正在session['flash']获取对象,这是Sinatra放置的Hash,假设它是FlashHash并尝试在其上调用sweep,因此错误消息:undefined method sweep for {}:Hash

可能的解决办法可能是在Sinatra应用中使用闪存而不是默认值(例如flash(:my_flash)[:error]="foo")。

如果您想在Rails和Sinatra之间使用闪存来查看消息,那将无济于事。

答案 1 :(得分:0)

“未定义方法扫描{}:哈希”问题是您的浏览器存储以前缓存的Cookie。只需删除与应用程序相关的cookie并刷新浏览器即可。它对我有用。