【问题标题】:How can session info be passed between Rack 1.6+ and Rails 4.2+如何在 Rack 1.6+ 和 Rails 4.2+ 之间传递会话信息
【发布时间】:2016-03-26 11:21:30
【问题描述】:

我读过this question,特别是this answer。这也可能是the same。我认为它们适用于比我现在使用的旧版本的 rack+rails

我有一个机架中间件:

config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do
  r301 %r{^/reviews/company/(\d+)}, lambda { |match, _rack_env|
    company = Company.find_by_id(match[1])

    case company.reviews.count
    when 0
      "/company-reviews"
    when 1..3
      "/#{company.slug}/reviews/"
      # set no_index = true
    else
      "/#{company.slug}/reviews/"
      # set no_index = false
    end
  }
end

在这些非零子句中,我想设置一个 no_index 变量以在控制器中可用。

module ApplicationHelper
  def application_meta_tags
    @application_meta_tags.merge(
      'no-index' => no_index_from_rack
    )
  end
end

在机架中的 lambda 内部,我可以做到

request = Rack::Request.new(env)
request.session['no-index']=true

但它不会出现在控制器范围内。

request.session.keys
# [
#     [0] "session_id",
#     [1] "_csrf_token"
# ]

由于看起来相似的答案没有奏效,我想知道这是由于

  • 我没有正确实现它们
  • 它们是在 lambda 范围内完成的
  • 别的...

我对在机架和导轨之间传递数据的完全不同的策略持开放态度。

更新

我目前正在使用“ENV”和/或Rails.configuration,但这不是基于会话的,每次使用后我都必须取消设置变量。即便如此,我怀疑比赛条件可能会扼杀我。

这是一个我可以设置稍后可供 Rails 使用的标题的地方吗?我试图了解在这些应用程序/上下文之间传递数据的正确概念是什么。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 session-variables rack


    【解决方案1】:

    你绝对不应该使用ENVRails.configuration,因为它们是全局变量,而且你知道全局变量是邪恶的。正如你所说,你会有竞争条件。

    如果没有理由在会话中存储no_index布尔值,则应直接使用env变量:

    你的中间件:

    class Middleware
      def initialize(app)
        @app = app
      end
    
      def call(env)
        env['app.no_index'] = true
        @app.call(env)
      end
    end
    

    您的控制器/视图:

    class Controller
      def new
        env['app.no_index'] # is true
      end
    end
    

    【讨论】:

    • 也许这会起作用;我会尽快尝试。我认为问题可能是我没有使用Class 作为中间件,而是使用我在config/application.rb 中直接给出的语法。
    • 我认为使用类也会遇到同样的问题,类或块中间件之间没有真正的区别。我认为 Rails 使用他自己的会话系统,因为它可以存储在文件、数据库、cookie 等中,并且可以签名或不签名。因此,我不确定您是否可以通过这种方式访问​​ Rails 会话。如果您不需要保留“无索引”信息,那么使用 env 变量不是问题,一些 Rails 插件就是这样使用的。
    猜你喜欢
    • 2015-08-14
    • 2010-10-24
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多