Понимание до и после_фильтра

#ruby-on-rails-3 #before-filter

#ruby-on-rails-3 #before-фильтр

Вопрос:

У меня есть следующий код сразу после объявления моего класса контроллера

   before_filter :load_form, :except => [:create, :update, :delete]
  after_filter :load_form, :only => [:create, :update, :delete]

  def load_form
    @severities = Severity.all
    @severity = Severity.new
  end
  

Я получаю список серьезностей, когда страница загружается нормально, что означает, что before_filter работает. Однако после вызова такого метода, как create, список серьезностей всегда возвращается как nil. Я думаю, что, вероятно, я просто упускаю из виду какую-то фундаментальную вещь о фильтрах. Кто-нибудь может помочь мне понять, почему after_filter не работает?

Ответ №1:

Если вы ожидали увидеть в своем представлении переменные, которые были назначены в вашем фильтре ‘after’, это не сработает, потому что фильтр не выполняется до тех пор, пока ваше представление не будет полностью обработано.

Комментарии:

1. ах, это имеет смысл, так какой фильтр мне следует использовать, чтобы иметь возможность видеть переменные в моем представлении?

2. Ну… до или около того. По какой причине вы решили, что вам следует использовать фильтр after?

3. Поскольку я устанавливал для объекта @severity значение new, я думал, что если я использую before_filter, я никогда не смогу сохранить, поскольку для объекта всегда будет установлено значение new, прежде чем я смогу получить доступ к параметрам для его сохранения.

4. Почему вы думаете, что присвоение значения @severity — это то, что должно происходить в фильтре «до», а не в методе action? На самом деле, если нет какой-либо причины, по которой для каждого (или почти каждого) действия требуется полный список строгостей, также нет особых причин назначать @severities фильтр.

5. Представления отображаются с помощью ajax, поэтому на одной странице есть форма для создания и обновления, а также список серьезностей. в каждом действии необходимо указывать новую и совокупность степеней серьезности, в противном случае генерируется исключение null. Вместо того, чтобы объявлять each в каждом действии, я бы предпочел сохранить все СУХИМ и установить эти значения для каждого действия с помощью фильтра.