在InheritedResources上成功创建或更新操作后运行操作

时间:2011-06-11 17:20:03

标签: ruby-on-rails ruby inherited-resources

我目前正在开发一些模块,使用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上的钩子吗?或者关于如何进行的任何其他想法?

3 个答案:

答案 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?