#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 в каждом действии, я бы предпочел сохранить все СУХИМ и установить эти значения для каждого действия с помощью фильтра.