问题描述
||
我目前正在开发几个模块,以使用InheritedResources(最新版本)应用程序在Rails 3上重用我的控制器中的代码。
我的想法是要在成功创建或更新资源后执行一些行为,但是除了重新声明\“ create \”或\“ update \”操作外,我不确定如何解决这个。
我目前正在使用类似
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
想象一下,您有一个用于该项目的表单,您还可以为其创建成员(嵌套表单)。创建关联成员时出错将使de project对象无效,但对于方法errors.empty,项目实例将返回true。