我还没有找到一个好的答案。如何让我的 Rails 应用程序和 Sinatra 应用程序(安装在我的 Rails 应用程序的 config.ru 中)成功共享会话?如果我先访问我的 Sinatra 应用程序,然后访问 Rails 应用程序,我会收到如下错误undefined method sweep for {}:Hash
,大概是因为 Rails 使用 Hash 的自定义子类来存储会话信息,而 Rack::Session::Cookie 则没有。到目前为止我的代码:
配置.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
我错过了什么吗?
A quick grep
Rails 源代码揭示了sweep
是一个方法ActionDispatch::Flash::FlashHash
,Rails 将其存储在会话下flash
key.
Sinatra-Flash 还使用flash
会话的密钥,但它存储一个普通的Hash
对象那里。
Rails 正在获取对象session['flash']
, 哪一个是Hash
由 Sinatra 放在那里,假设它是FlashHash
并试图打电话sweep
在它上面,因此出现错误消息:undefined method sweep for {}:Hash
.
一个可能的解决方法可能是在 Sinatra 应用程序中为 Flash 使用不同的键而不是默认键(例如flash(:my_flash)[:error]="foo"
).
不过,如果您想在 Rails 和 Sinatra 之间切换时使用 Flash 查看消息,这将无济于事。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)