加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails:在请求范围内共享信息

发布时间:2020-12-17 02:42:11 所属栏目:百科 来源:网络整理
导读:Rails在当前请求范围内共享信息的机制是什么? 那些熟悉Asp.Net的人会知道有一个HttpContext可供请求期间调用的所有实体使用. Rails中有类似的东西吗? 解决方法 使用around_filter和Thread.current [],您可以轻松创建请求上下文/范围.请参阅以下示例. 首先
Rails在当前请求范围内共享信息的机制是什么?

那些熟悉Asp.Net的人会知道有一个HttpContext可供请求期间调用的所有实体使用.

Rails中有类似的东西吗?

解决方法

使用around_filter和Thread.current [],您可以轻松创建请求上下文/范围.请参阅以下示例.

首先添加你的application_controller.rb:

around_filter :request_context

  def request_context
    begin
      RequestContext.begin_request
      yield
    ensure
      RequestContext.end_request
    end
  end

现在将以下类添加到lib / request_context.rb

class RequestContext
  def self.instance
    i = Thread.current[:request_context]
    unless i
      raise "No instance present. In script/rakefiles: use RequestContext.with_scope {}," +
            "in controller: ensure `around_filter :request_scope` is configured"
    end
    return i
  end

  # Allows the use of this scope from rake/scripts
  # ContextScope.with_scope do |scope|
  #   # do something
  #   ...
  # end
  def self.with_scope
    begin
      begin_request
      yield(instance)
    ensure
      end_request
    end
  end

  def self.begin_request
    raise "request_context already set" if Thread.current[:request_context]
    Thread.current[:request_context] = RequestContext.new
  end

  def self.end_request
    raise "request_context already nil" unless Thread.current[:request_context]
    Thread.current[:request_context] = nil
  end

  # user part,add constructors/getters/setters here

  def initialize
    # you can setup stuff here,be aware that this
    # is being called in _every_ request.
  end
end

这非常简单.您可以将数据存储在RequestContext.instance对象中,该对象将在每次请求后重新创建.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读