【发布时间】: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