【问题标题】:Access Rails 3 Session from Rack?从机架访问 Rails 3 会话?
【发布时间】:2011-02-17 22:18:22
【问题描述】:

我能够在 Rails 2.3.5 中执行以下操作,以从我的 Rails 应用程序中访问我在会话中设置的属性。现在在 Rails 3 中,env["rack.session"]nil。我如何在 Rails 3 中做同样的事情?

class CallbackFilter
  def initialize(app)
    @app = app
  end

  def call(env)
    unless env["rack.session"][:oauth_callback_method].blank?
      env["REQUEST_METHOD"] = env["rack.session"].delete(:oauth_callback_method).to_s.upcase
    end
    @app.call(env)
  end
end

【问题讨论】:

    标签: ruby-on-rails session ruby-on-rails-3 rack


    【解决方案1】:

    还有另一种“肮脏”的同步方式(对于那些由于某些原因无法将机架应用程序集成到 rails 的人)。

    您应该在 Rails 和 Rack 中将 :key 和 :secret 设置为相同的值。

    在 rails :secret 分配为 ChatApp::Application.config.secret_token 并且通常在 initializers/secret_token.rb 中配置,在 session_store.rb 中有一个 :key 选项用于YourApp::Application.config.session_store)。所以最后会是这样的:

    Rack::Builder.new 块中:

    use Rack::Session::Cookie, :key => '_your_app_session',
                                   :path => '/',
                                   :secret => 'secret_more_than_30_dig'
    

    初始化程序/session_store.rb

    YourApp::Application.config.session_store :cookie_store, :key => '_your_app_session',
                                                              :path => '/'
    

    初始化程序/secret_token.rb

    YourApp::Application.config.secret_token = 'secret_more_than_30_dig'
    

    现在你应该可以访问它了 throw request.env['rack.session']

    【讨论】:

    • 它对我有用。我集成了 Rails 和 Sinatra。两者都使用相同的 cookie 进行用户身份验证。谢谢!
    【解决方案2】:

    这是因为我将use CallbackFilter 放在config.ru 中。它应该像这样放在config/application.rb

    config.middleware.use CallbackFilter
    

    否则环境看起来不同步......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 2015-09-09
      • 2011-12-30
      • 1970-01-01
      • 2011-04-11
      相关资源
      最近更新 更多