Где инициализировать переменные в Rails 3 - PullRequest
3 голосов
/ 17 августа 2011

Я открывал для себя Ruby on Rails в течение последних 3 месяцев, и я очарован. Но несколько вещей, которые я не знаю, какой лучший способ сделать это. Теперь я стек с инициализацией некоторых переменных. Все приложение выполняется через ajax, поэтому все переменные экземпляра следует инициализировать только один раз.

Я попытался написать метод 'initialize' в applicationController, который запускается только один раз, но проблема в том, что я получаю доступ к объекту запроса, который еще не инициализирован.

Я пытался использовать before_filter в applicationController, но он запускается при каждом моем запросе, даже если это ajax-запрос.

Кто-нибудь знает, как инициализировать переменную экземпляра значением из объекта запроса? Да, возможно, вопрос новичка.

Я использую Ruby 1.8.7 и Rails 3. Заранее спасибо

Ответы [ 3 ]

8 голосов
/ 17 августа 2011

Полагаю, вы захотите выполнить часть инициализации, когда попадете на страницу и пропустите ее для всех запросов ajax с той же страницы.

class ApplicationController < ActionController::Base

  before_filter :load_vars

  protected

  def load_vars
    unless request.xhr? #check if ajax call
       # do all your initialization here
    end
  end

end
1 голос
/ 17 августа 2011

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

Я пробовал before_filter в applicationController, но он запускается при каждом моем запросе, даже если это ajax-запрос.

Обратите внимание, что ajax-запрос - это обычный запрос, видимый со стороны сервера, поэтому я не понимаю ваше "даже".Если значение, которое вы проверяете, исходит из параметра запроса и вам это нужно в каждом контроллере / действии, вы действительно выполняете эту инициализацию в ApplicationController, в противном случае вы можете вызвать этот фильтр только в некотором контроллере (или даже только для какого-то действия)с этим синтаксисом

# to execute it only for some actions
before_filter :your_initialization_method, :only => [:action1, :action2]
# or to exclude some actions
before_filter :your_initialization_method, :except => [:action1, :action2]

Если вам нужно совместно использовать этот метод для разных контроллеров, определите его в ApplicationController и выполняйте вызов before_filter только в соответствующих контроллерах.

1 голос
/ 17 августа 2011

Этого можно достичь, используя фильтр before, например:

ApplicationController < ActionController::Base

  before_filter :make_it_rain


  protected

  def make_it_rain
    @rain = 'lots'
    # You should have access to 'request' in here
    # Try raise request.inspect for info
  end


end

Вы можете поместить фильтр before в конкретный контроллер, если он применяется только к одной части приложения, или использовать его.бежать за конкретное действие.

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