Выполнение действий после успешного создания или обновления действий на InheritedResources - PullRequest
1 голос
/ 11 июня 2011

В настоящее время я разрабатываю несколько модулей для повторного использования кода из моих контроллеров на 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 в сеансе и сравнивая, обновилась ли модель (если это так, она должна была быть успешной) и запустила метод.

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

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

Ответы [ 3 ]

3 голосов
/ 13 июня 2011

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

2 голосов
/ 13 июня 2011

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

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

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

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

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

2 голосов
/ 12 июня 2011

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

class BaseController < InheritedResources::Base

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

# ...
end

class YourController < BaseController
# ...
end
...