我目前正在开发一些模块,使用InheritedResources(最新版本)应用程序在Rails 3上重用我的控制器中的代码。
我的想法是在成功创建或更新资源之后应该运行一些行为,但除了重新声明“创建”或“更新”操作之外,我不确定如何解决这个问题。
我目前正在使用像
这样的东西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信息保存到会话中并进行比较以查看模型是否已更新(如果是,它应该已成功)并运行该方法来处理它。
但是,我不满意它(有点hacky),而且我还计划在更新之后使用其他模块来处理资源,并且不想两次使用相同的方法。
我应该使用IR上的钩子吗?或者关于如何进行的任何其他想法?
答案 0 :(得分:3)
我使用“object.errors.empty?”解决了这个问题。条件。如果在创建或更新操作后对象上没有错误,则可以安全地假设模型已正确保存,因此运行代码就可以了。
答案 1 :(得分: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
答案 2 :(得分:2)
我很遗憾使用答案功能进行评论,但由于我无法在你的回答中做到这一点,我认为没有别的选择。
“object.errors.empty?”条件。如果在创建或更新操作后对象上没有错误,则可以安全地假设模型已正确保存
我认为这并非总是如此,让我举起你的例子:
class Project < ActiveRecord:Base
has_many :members
# ...
end
想象一下,你有一个项目表单,你也可以为它创建成员(嵌套表单)。创建关联成员时的错误会使de项目对象无效,但项目实例将为方法errors.empty返回true?