1

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

4

3 回答 3

3

我已经通过使用“object.errors.empty?”解决了它。健康)状况。如果在创建或更新操作后对象上没有错误,则可以安全地假设模型已正确保存,因此运行代码就可以了。

于 2011-06-12T22:36:25.267 回答
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
于 2011-06-11T20:46:02.793 回答
2

很抱歉使用答案功能发表评论,但由于我无法根据您的答案进行评论,因此我看不到其他选择。

“object.errors.empty?” 健康)状况。如果在创建或更新操作后对象上没有错误,则可以安全地假设模型已正确保存

我认为这并不总是正确的,让我举个例子:

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

想象一下,您有一个项目表单,您还可以在其中为其创建成员(嵌套表单)。创建关联成员的错误会使de项目对象无效,但项目实例会为方法errors.empty返回true。

于 2011-06-13T10:31:09.000 回答