Rails + Sinatra 应用程序分享会

2024-02-05

我还没有找到一个好的答案。如何让我的 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 grepRails 源代码揭示了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(使用前将#替换为@)

Rails + Sinatra 应用程序分享会 的相关文章

随机推荐