我目前正在使用InheritedResources(最新版本)应用程序开发几个模块,以重用Rails3上控制器的代码。
我的想法是在成功创建或更新资源后运行一些行为,但除了重新定义"创建"或"更新"操作之外,我不确定如何解决这个问题。
我目前正在使用类似的东西
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
我使用了一个特定的资源设置,其中包括将资源的id添加到会话中。在资源成功保存到BD后,我想从会话中删除它的id,这就是After_filter所做的。
到目前为止,我还通过将updated_at信息保存到会话中并进行比较来查看模型是否已更新(如果是,则应该已成功更新)并运行该方法。
然而,我对此并不满意(有点生气),而且我还计划让其他模块在更新后也能使用资源,不想两次使用相同的方法。
IR上有我应该使用的挂钩吗?或者还有其他关于如何进行的想法吗?
我已经通过使用"object.errors.empty?"条件解决了这个问题。如果在创建或更新操作之后对象上没有错误,那么可以放心地假设模型保存正确,因此运行代码就可以了。
也许您可以使用基于继承的方法:
class BaseController < InheritedResources::Base
before_filter :setup_resource, :only => :new
after_filter :reset_session_resource_id, :only => [:create, :update]
# ...
end
class YourController < BaseController
# ...
end
很抱歉使用回答功能进行评论,但由于我不能在您的回答下进行,我看不到其他选项。
"object.errors.empty?"条件。如果在创建或更新操作后对象上没有错误,则可以安全地假设模型已正确保存
我认为这并不总是真的,让我举个例子:
class Project < ActiveRecord:Base
has_many :members
# ...
end
想象一下,您有一个项目的表单,您也可以为它创建成员(嵌套表单)。创建关联成员时的错误将使反项目对象无效,但对于方法Errors,项目实例将返回true。是否为空?