Как я храню переменную экземпляра через несколько действий в контроллере?

Если Вы хотите удостовериться, что каждый член массива явно инициализируется, просто опустите размер от объявления:

int myArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

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

int myPoints[][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };

в порядке, но

int myPoints[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9} };

не.

14
задан Sam P 22 July 2009 в 20:22
поделиться

5 ответов

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

Если вы не хотите сохранять его в сеансе или модели базы данных, у вас не так много вариантов, если вы ' мы хотим, чтобы эта переменная была специфичной для конкретного сеанса.

Если она является глобальной для всех сеансов, вы можете поместить ее в @@ class_variable , а не в @instance_variable , но это может стать беспорядочным, если вы начнете использовать несколько процессов Rails (каждый из которых будет иметь свою собственную копию), или если вы работаете в потокобезопасном режиме, вы можете столкнуться с неприятными ошибками параллелизма.

Думаю, вы могли бы посмотрите на что-то вроде memcached, но вы

22
ответ дан 1 December 2019 в 06:48
поделиться

Не волнуйтесь, сеансы не кусаются.

Кроме того, сеанс, вероятно, лучший способ сделать это.

1
ответ дан 1 December 2019 в 06:48
поделиться

Вы могли бы сделать использование встроенного механизма Rails.cache для хранения значения, но, как упоминалось в первом ответе, вам придется отключить что-то вроде user_id. Это хороший способ, поскольку вы можете поддерживать его с помощью различных механизмов хранения.

Rails.cache.write(:foo)
# in later action
Rails.cache.read(:foo)

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

Итак, в действии 1 вы можете создать значение:

flash[:foo] = some_value
flash.keep(:foo)

В действии 2 вы можете получить к нему доступ и снова вызвать keep, если хотите, чтобы он оставался в живых для других последующих действий.

flash[:foo] #use it for something
flash.keep(:foo) # keep it for another request

Это немного сложная вещь для делать чисто в контексте HTTP-запросов.

7
ответ дан 1 December 2019 в 06:48
поделиться

Мне тоже интересно, почему вы против использования сеанса? Если вам не нравится работать с сеансом непосредственно в ваших действиях, вы можете эмулировать сохранившуюся переменную экземпляра @foo с помощью фильтров. Может, что-то вроде этого?

class FooController < ApplicationController
  before_filter :load_foo
  after_filter :save_foo

  private
    def load_foo
      @foo = session[:foo] || 0
    end

    def save_foo
      session[:foo] = @foo
    end

end

Ваши действия смогут управлять значением с помощью переменной экземпляра @count , и это будет автоматически сохранено в сеансе.

11
ответ дан 1 December 2019 в 06:48
поделиться

Если это простой счетчик или строка, я думаю, что лучшим решением будет сохранить их в сеансе. Таким образом, он будет там, если вы используете несколько веб-серверов.

Почему вы против использования сеанса для этого?

1
ответ дан 1 December 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: