Rails + Sinatra应用程序共享会话
我还没有找到一个好的答案。 如何才能将我的Rails应用程序和Sinatra应用程序(安装在我的Rails应用程序的config.ru中)成功共享会话? 如果我首先访问我的Sinatra应用程序,然后是Rails应用程序,我得到一个错误,如undefined method sweep for {}:Hash
,大概是因为Rails使用Hash的自定义子类来存储会话信息,而Rack :: Session :: Cookie不会“T。 我的代码到目前为止:
config.ru
map "/" do run MyRailsApp::Application end map "/sinatra" do use Rack::Session::Cookie, key: "_app_session", secret: "" run MySinatraApp end
配置/初始化/ session_store.rb
MyRailsApp::Application.config.session_store :cookie_store, key: '_app_session'
配置/初始化/ secret_token.rb
MyRailsApp::Application.config.secret_token = "" # same as config.ru
我错过了什么?
Rails源代码的快速报告显示, sweep
是ActionDispatch::Flash::FlashHash
上的一种方法,Rails将该方法存储在flash
key下的会话中。
Sinatra-Flash也使用会话的flash
键,但它在那里存储一个普通的Hash
对象。
Rails在session['flash']
获取对象,这是由Sinatra放置的Hash
,假设它是一个FlashHash
并尝试在其上调用sweep
,因此错误消息: undefined method sweep for {}:Hash
。
可能的解决方法可能是在Sinatra应用程序中使用闪存中的不同键而不是默认值(例如flash(:my_flash)[:error]="foo"
)。
如果你想在Rails和Sinatra之间使用flash来查看消息,那将无济于事。
“未定义方法扫描{}:哈希”问题是您的浏览器存储以前缓存的Cookie。 只需删除与应用程序相关的cookie并刷新浏览器即可。 它对我有用。