Rails + Sinatra 应用程序共享会话

3
我还没有找到一个好的答案。如何让我的Rails应用程序和挂载在Rails应用程序的config.ru文件中的Sinatra应用程序成功共享会话?如果我先访问Sinatra应用程序,然后访问Rails应用程序,我会得到一个错误,如undefined method sweep for {}:Hash,这可能是因为Rails使用自定义的Hash子类来存储会话信息,并且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

有我漏掉的吗?

你在Sinatra应用程序中使用rack-flash(或其他flash实现)吗? - matt
我正在使用sinatra-flash。 - codykrieger
2
我认为正在发生的是sinatra-flash在"flash"键下将一个(普通的Ruby)哈希添加到会话中。Rails期望该键下的任何内容都是ActionDispatch::Flash::FlashHash对象,并尝试调用sweep方法,因此出现错误undefined method sweep for {}:Hash。一个可能的解决方法是在Sinatra应用程序中使用不同的键来存储flash而不是默认值(例如flash(:my_flash)[:error]="foo")。但如果您想在Rails和Sinatra之间使用flash查看消息,则无法解决该问题。 - matt
那肯定没问题 - 我不打算传递闪存消息。我会尝试一下,看看是否可以解决问题。 - codykrieger
没错,就是这个了。非常感谢。如果您提供一个答案我可以标记为正确答案。 - codykrieger
2个回答

4
Rails源代码中的快速grep显示,sweep是一个来自ActionDispatch::Flash::FlashHash的方法,Rails将其存储在会话中的flash键下。
Sinatra-Flash也使用会话的flash键,但它在那里存储了一个普通的Hash对象。
Rails通过session['flash']获取对象,该对象是由Sinatra放置的Hash,假设它是一个FlashHash 并尝试在其上调用sweep,因此出现了错误消息:undefined method sweep for {}:Hash
可能的解决方法是在Sinatra应用程序中使用不同于默认值的键(例如flash(:my_flash)[:error]="foo")来存储flash。
然而,如果要在Rails和Sinatra之间使用flash查看消息,这种方法就无法帮助了。

0

在你的浏览器中出现了"undefined method sweep for {}:Hash"的问题,这是因为浏览器存储了先前缓存的 cookies。只需删除与该应用相关的 cookies,并刷新浏览器即可解决。我已经尝试过,效果很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接