#ruby-on-rails #ruby #inherited-resources
#ruby-on-rails #ruby #унаследованные ресурсы
Вопрос:
В настоящее время я разрабатываю пару модулей для повторного использования кода с моих контроллеров на 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, который я должен использовать? Или какие-либо другие идеи о том, как действовать дальше?
Комментарии:
1. Я думал об использовании кодов состояния HTTP. Нравится применять код только в том случае, если подготовленный запрос был «200» или что-то подобное, но также не уверен в этом подходе (или сработает ли он в любом случае)
Ответ №1:
Я решил это с помощью «object.errors.empty?» условие. Если после действия по созданию или обновлению в объекте нет ошибок, можно с уверенностью предположить, что модель была сохранена правильно, и, таким образом, выполнение кода будет в порядке.
Ответ №2:
Возможно, вы могли бы вместо этого использовать подход, основанный на наследовании:
class BaseController < InheritedResources::Base
before_filter :setup_resource, :only => :new
after_filter :reset_session_resource_id, :only => [:create, :update]
# ...
end
class YourController < BaseController
# ...
end
Комментарии:
1. Дело в том, что мы используем поведение, которое также должно быть общим для других приложений. И, кроме того, after_filter все равно будет выполняться, даже если ресурс не был сохранен 🙁 (из-за неправильных или отсутствующих проверок и тому подобного)
2. «объект.ошибки.пустой?» условие. Если после действия создания или обновления в объекте нет ошибок, можно с уверенностью предположить, что модель была сохранена должным образом При условии, что у нас есть, скажем, класс Project, в котором много членов Представьте, что у вас есть форма для проекта, в которой вы также могли бы создавать для него элементы (вложенные формы). Ошибки при создании связанных элементов сделают объект project недействительным, но экземпляр project вернет true для ошибок метода.пусто?
Ответ №3:
Извините, что использую функцию ответа для комментария, но поскольку я не могу сделать это под вашим ответом, я не вижу другого варианта.
«объект.ошибки.пустой?» условие. Если после действия по созданию или обновлению в объекте нет ошибок, можно с уверенностью предположить, что модель была сохранена правильно
Я думаю, что это не всегда верно, позвольте мне привести вам пример:
class Project < ActiveRecord:Base
has_many :members
# ...
end
Представьте, что у вас есть форма для проекта, где вы также можете создавать для него элементы (вложенные формы). Ошибки при создании связанных элементов сделают объект проекта недействительным, но экземпляр проекта вернет true для ошибок метода.пусто?
Комментарии:
1. Кажется допустимым предположением. Поскольку контроллеры, которым требуется такое поведение, не затронуты и не будут использовать вложенные формы, это не повлияет на нас, но я запишу это и добавлю некоторый тест, чтобы учесть это. Спасибо!