ruby-on-rails - Rails + Sinatra 应用程序共享 session

标签 ruby-on-rails ruby session cookies sinatra

我还没有找到一个好的答案。如何让我的 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 显示 sweepActionDispatch::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 应用程序共享 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9135236/

相关文章:

ruby-on-rails - 如何让 Rack::Attack 在负载均衡器后面工作?

html - 更改 Bootstrap 类导航栏品牌的字符颜色

ruby - Windows 上 jruby 下的 rspec 测试运行非常慢

javascript - 在 Node.js 和 express-session 中更改和刷新 session 数据

javascript - PHP:如何使用PHP中的GET将值存储到数组

ruby-on-rails - 对命名范围的验证

ruby-on-rails - 替换字符串中的电子邮件、电话和地址(就像 AirBnB 一样)?

ruby-on-rails - sqlite3 gem 安装失败

ruby - Axlsx Ruby Gem - 使用自定义值创建下拉列表

php - 前缀已添加到我的Cookie名称中