我还没有找到一个好的答案。如何让我的 Rails 应用程序和 Sinatra 应用程序(安装在我的 Rails 应用程序的 config.ru 中)成功共享 session ?如果我先访问我的 Sinatra 应用程序,然后访问 Rails 应用程序,我会收到类似 undefined method sweep for {}:Hash
的错误,大概是因为 Rails 使用 Hash 的自定义子类来存储 session 信息,而 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
我错过了什么吗?
最佳答案
Rails 源代码的快速 grep
显示 sweep
是 ActionDispatch::Flash::FlashHash
上的一个方法,Rails 将其存储在flash
键下的 session 。
Sinatra-Flash 也使用 session 的 flash
键,但它在那里存储一个普通的 Hash
对象。
Rails 正在 session['flash']
获取对象,这是 Sinatra 放在那里的 Hash
,假设它是一个 FlashHash
并尝试对其调用 sweep
,因此出现错误消息:undefined method sweep for {}:Hash
。
一个可能的解决方法是在 Sinatra 应用程序中为 Flash 使用不同的键而不是默认键(例如 flash(:my_flash)[:error]="foo"
)。
不过,如果您想在 Rails 和 Sinatra 之间切换时使用 flash 查看消息,那将无济于事。
关于ruby-on-rails - Rails + Sinatra 应用分享会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9135236/