Подтвердить что ты не робот

Какие данные (если они есть) сохраняются в веб-запросах в Ruby on Rails?

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Я знаю, что этот пост старый, но для тех, кто ищет решение, можно использовать 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 открывает новый поток для каждого запроса, поэтому я пишу в ОЗУ свои данные в формате "key: value"

Rails.cache в разных потоках, не кэширующих?

Ответ 3

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