Есть ли у Rails хранилище для каждого запроса, в которое я могу добавлять объекты и получать из них? - PullRequest
1 голос
/ 04 ноября 2010

В asp.net есть что-то под названием Request.Items, к которому я могу добавить объект, а затем я могу проверить, присутствует ли объект в коллекции .Items из другой части моего кода (как в другом классе). ).

Есть ли в Rails что-то подобное?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2015

Один из самых популярных вариантов - использовать драгоценный камень request_store, который позволяет вам получить доступ к глобальному магазину из любой части вашего кода.Он использует Thread.current для хранения ваших данных и заботится об очистке данных после каждого запроса.

RequestStore[:items] = []

Имейте в виду, что поскольку он использует Thread.current, он не будет работать должныммногопоточная среда, в которой у вас есть более одного потока на запрос.

Чтобы обойти эту проблему, я реализовал хранилище, которое может совместно использоваться потоками для одного и того же запроса.Это называется request_store_rails, и использование очень похоже:

RequestLocals[:items] = []
0 голосов
/ 04 ноября 2010

Вы можете определить метод класса (в любом классе, который вы хотите) для хранения ваших данных:

class Xyzzy
  def self.items
    @items ||= {}
  end
end
# ....
if Xyzzy.items.include? :fubar
  Xyzzy.items[:asd] = 1
end

Но вы должны решить, когда вы хотите очистить этот «кеш».Если вы хотите его только для одного запроса, определите before_filter, который будет вызывать Xyzzy.items.clear

Объекты класса являются глобальными.Вы также можете использовать стандартную глобальную переменную, но это было бы менее элегантно.:)

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