我还没有找到一个好的答案。如何才能将我的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
我错过了什么?
答案 0 :(得分:4)
Rails源代码的快速grep
显示sweep
是ActionDispatch::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并刷新浏览器即可。它对我有用。