Rails не может кэшировать предварительно рассчитанные значения через запросы браузера?(например, запоминание n факторных результатов) - PullRequest
0 голосов
/ 26 октября 2010

Например, следующий код:

class FoosController < ApplicationController
  def index
    if !@foo.nil?
      render :locals => {:bar => @foo}
      return
    else 
      @foo = rand 10
      render :locals => {:bar => @foo}
    end
  end
end

если я загружу localhost:3000/foos несколько раз, он покажет разные значения, и это не удивительно, если это режим разработки, потому что Rails перезагрузит контроллер(и модель, и вид) каждый раз, когда поступает запрос браузера.

Но даже когда в рабочем режиме, когда все загружено и остается там, значение @foo не останется в запросах браузера?Каждый раз при перезагрузке страницы в веб-браузере отображается другое число.То есть Rails каждый раз будет стирать все значения?Есть ли способ кэшировать или «запоминать» результаты по запросам, если мы не используем СУБД?


Удивительно, но я только что попытался использовать переменную класса, и в режиме разработки это даетразные номера каждый раз.В производственном режиме число остается неизменным в Firefox, и затем Chrome также будет показывать это число все время, пока сервер не будет перезапущен:

class FoosController < ApplicationController
  @@foo = nil

  def index
    if !@@foo.nil?
      render :locals => {:bar => @@foo}
      return
    else 
      @@foo = rand 10
      render :locals => {:bar => @@foo}
    end
  end
end

Почему переменная класса может запоминать, а переменная экземпляра может«т?Является ли использование переменной класса надежным способом надежного «запоминания» в запросе в Rails 2.x, 3.x и Ruby 1.8.7 и 1.9.2?

Ответы [ 3 ]

5 голосов
/ 26 октября 2010

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

Возможно, вы захотите использовать хеши session или flash для хранения @foo между запросами.

class FoosController < ApplicationController
  def index
    @foo = session[:foo] ||= rand(10)
    render :locals => {:bar => @foo}
  end
end

session[:foo] будет постоянным на протяжении всего пути, но вы можете использовать flash[:foo], если вы просто хотите сохранить его в течение одного запроса.

2 голосов
/ 26 октября 2010

@@foo обозначает переменную класса, @foo переменную экземпляра.Новый экземпляр контроллера создается при каждом запросе.А для кеширования я действительно рекомендую memcache или что-то подобное (из-за разветвленности серверов rails).

0 голосов
/ 26 октября 2010

Даже если вы запечатлели то, что предлагает edgerunner, на производстве у вас может быть запущено несколько беспорядочных или тонких экземпляров, и у каждого из этих контроллеров будут разные флэш-переменные, и текущий подход не сработает.Продолжайте с тем, что Тасс говорит что-то вроде memcache или redis, чтобы сохранить такие вещи в памяти.

...