Rails: делиться информацией в пределах объема запроса - PullRequest
5 голосов
/ 06 сентября 2011

Каков механизм в Rails для обмена информацией в текущей области запроса?

Те, кто знаком с Asp.Net, знают, что существует HttpContext, который доступен всем сущностям, которые вызываются во время запроса.

Что-нибудь похожее в Rails?

Ответы [ 2 ]

7 голосов
/ 02 сентября 2013

С помощью 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, объект будет воссоздан после каждого запроса.

1 голос
/ 07 сентября 2011

Насколько мне известно, нет ни одного встроенного. Потребность в хэше, ограниченном запросами, является неприятным запахом в моих книгах. С каждым запросом связано только одно действие, и оттуда вы должны использовать объекты модели для выполнения большей части работы.

Подумайте о конвейере "запроса" Rails MVC:

  1. Браузер отправляет запрос на URI
  2. Rails ищет контроллер и действия на основе информации о маршрутизации
  3. Rails создает отдельный экземпляр этого контроллера и вызывает действие как метод (с любыми параметрами [] в качестве параметра)

Этот единственный экземпляр контроллера, который создается в ответ на запрос, распространяется только на ваш текущий запрос (т. Е. Именно то, что вы ищете). Если вам нужно поделиться данными запроса, поставить их на свой контроллер или еще лучше, включить их в свои действия, или даже лучше ... В ваших моделях.

Зачем вам это нужно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...