Выполнение действий после успешного создания или обновления действий с унаследованными ресурсами

StackOverflow https://stackoverflow.com/questions/6317389

Вопрос

В настоящее время я разрабатываю пару модулей для повторного использования кода из моих контроллеров на Rails 3 с использованием приложения InheritedResources (последняя версия).

Моя идея состоит в том, чтобы иметь некоторое поведение, которое должно запускаться после успешного создания или обновления ресурса, но, за исключением повторного объявления действий "создать" или "обновить", я не уверен, как с этим справиться.

В настоящее время я использую что-то вроде

module SessionStorable

  extend ActiveSupport::Concern
  include Base

  included do
    before_filter :setup_resource, :only => :new
    after_filter :reset_session_resource_id, :only => [:create, :update]
  end


  # ....

end

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

До сих пор я справлялся с этим, также сохраняя информацию updated_at в сеансе и сравнивая, была ли обновлена модель (если да, то это должно было быть успешно), и запускаю метод.

Тем не менее, я не доволен этим (своего рода хакерство), а также я планирую иметь другие модули, которые будут работать с ресурсами также после их обновления, и не хотел бы использовать один и тот же подход дважды.

Есть ли в IR какой-нибудь хук, который я должен использовать?Или какие-нибудь другие идеи о том, как действовать дальше?

Это было полезно?

Решение

Я решил это, используя условие "object.errors.empty?" .Если после действия create или update в объекте нет ошибок, можно с уверенностью предположить, что модель была сохранена правильно, и, таким образом, выполнение кода было бы нормальным.

Другие советы

Может быть, вместо этого вы могли бы использовать подход, основанный на наследовании:

class BaseController < InheritedResources::Base

before_filter :setup_resource, :only => :new
after_filter :reset_session_resource_id, :only => [:create, :update]

# ...
end

class YourController < BaseController
# ...
end

Я сожалею, что использую функцию ответа для комментария, но поскольку я не могу сделать это под вашим ответом, я не вижу другого варианта.

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

Я думаю, что это не всегда так, позвольте мне привести вам пример:

class Project < ActiveRecord:Base
  has_many :members
  # ...
end

Представьте, что у вас есть форма для проекта, где вы также можете создавать для него участников (вложенные формы).Ошибки при создании связанных элементов сделают объект проекта недействительным, но экземпляр проекта вернет true для метода errors.empty?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top