Какие данные (если таковые имеются) сохраняются в веб-запросах в Ruby on Rails? - PullRequest
18 голосов
/ 07 мая 2010

Я решил использовать шаблон проектирования singleton при создании класса помощника вида. Это заставило меня задуматься; будет ли синглтон экземпляр выживать при разных запросах? Это привело к другому вопросу: Какие переменные (если таковые имеются) сохраняются в веб-запросах и меняется ли это в зависимости от развертывания? (Fastcgi, Mongrel, Passenger, ...)

Я знаю, что переменные экземпляра контроллера не сохраняются. Я знаю, что константы сохраняются (или перезагружаются?). Но я не знаю о переменных класса, переменных экземпляра класса, собственных классах, ...

Ответы [ 3 ]

18 голосов
/ 08 мая 2010

Простой ответ - нет.Каждый запрос обрабатывается как независимое событие, и никакая информация о состоянии не переносится, кроме того, что хранится в пользовательском сеансе и любых внешних базах данных, кэшах или хранилищах файлов.Лучше всего, если вы разрабатываете свое приложение с учетом этого и не ожидаете, что что-то сохранится только потому, что вы его установили.

Более сложная история заключается в том, что некоторые вещи сохраняются.Например, вы можете создать переменную класса на контроллере, и это будет передаваться из одного запроса в другой, как вы могли бы ожидать.Суть в том, что это относится только к единственному экземпляру этого контроллера, содержащемуся в этом процессе, и не будет применяться к запросам, обслуживаемым другими процессами.Если вам необходимо кэширование, используйте инфраструктуру Rails.cache и избегайте собственных хакерских атак.

Типичная производственная среда - сложная, постоянно меняющаяся вещь, где процессы создаются и уничтожаются постоянно, а их нет.способ заранее определить, какой процесс в конечном итоге будет обслуживать конкретный запрос.Поскольку во многих развертываниях используются не только несколько процессов на одном компьютере, но и несколько компьютеров, на самом деле не существует практического способа создания одноэлементных объектов для всего приложения.

Лучшее, что вы можете сделать, - это создать слой поверхмеханизм кэширования, где ваш одноэлементный объект является просто оболочкой для функций, которые выбирают и записывают из кэша.Это дает вам вид единичного объекта при сохранении согласованности между процессами.

0 голосов
/ 07 декабря 2017

Я знаю, что этот пост старый, но для тех, кто ищет решение, можно использовать Rails.Cache, например:

class TestEventsController < ApplicationController
  require 'httparty'

  @@cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 5.minutes)

  before_action :get_data, only: [:get]
  before_action :get_response, only: [:set]

  def get
    uri = "https://hooks.zapier.com/hooks/catch/zap_id/"
    event_id = event_id_generate()
    @@cache.write(event_id, "")

    result = HTTParty.post(uri.to_str,
    :body => {id: event_id, data: @data}.to_json,
    :headers => {'content-Type' => 'application/json'})
    sleep 2
    render json: { 'value': @@cache.read(event_id) }, status: 200
  end

  def set
    @@cache.write(@id, @value)
    render json: { 'value': @@cache.read(@id) }, status: 200
  end

  def get_data
    @data = params["data"]
  end
  def get_response
    @id = params["id"]
    @value = params["value"]
  end

  def event_id_generate
    token = SecureRandom.urlsafe_base64(10, false)
  end
end

Что я делаю, так это получаю запрос на маршруте, отправляю GET Zapier и жду ответа на другом маршруте. Rails открывает новый поток для каждого запроса, поэтому я записываю в оперативную память свои данные в формате «ключ: значение»

Rails.cache в разных потоках не кешируется?

0 голосов
/ 08 мая 2010

Интернет является средой без гражданства. Если вы не намеренно сохраняете данные в сеансе или не передаете их в get или post, каждый веб-запрос начинается с чистого листа. Любые объекты, созданные с помощью текущего запроса, уничтожаются после доставки страницы в веб-браузер.

...