Rails Observer Alternatives for 4.0

随着Observers正式从Rails 4.0中移除,我很好奇其他开发者正在使用什么。 (除了使用提取的宝石之外)虽然观察者当然受到了滥用,并且有时很容易变得笨拙,但除了缓存清理之外,还有许多用例是有益的。

例如,需要一个需要跟踪对模型的更改的应用程序。 观察者可以很容易地观察模型A的变化,并在数据库中用模型B记录这些变化。 如果你想观察几个模型的变化,那么一个观察者就可以处理这个变化。

在Rails 4中,我很好奇其他开发人员用什么策略代替观察者来重新创建该功能。

就我个人而言,我倾向于实现一种“胖控制器”,在每个模型控制器的创建/更新/删除方法中跟踪这些更改。 虽然它稍微扩大了每个控制器的行为,但它确实有助于可读性和理解,因为所有代码都位于同一位置。 缺点是现在有几个控制器中的代码非常相似。 将代码提取到辅助方法中是一种选择,但您仍然会对那些遍地乱放的方法进行调用。 不是世界的尽头,但也不完全符合“瘦身控制器”的精神。

ActiveRecord回调是另一种可能的选择,尽管我不喜欢它,因为它倾向于将两种不同的模型紧密结合在一起,在我看来。

因此,在Rails 4中,无观察者世界,如果在创建/更新/销毁另一个记录之后必须创建新记录,那么您将使用哪种设计模式? 脂肪控制器,ActiveRecord回调,或其他完全吗?

谢谢。


看看关注点

在模型目录中创建一个名为concern的文件夹。 在那里添加一个模块:

module MyConcernModule
  extend ActiveSupport::Concern

  included do
    after_save :do_something
  end

  def do_something
     ...
  end
end

接下来,在你想运行after_save的模型中加入:

class MyModel < ActiveRecord::Base
  include MyConcernModule
end

根据你在做什么,这可能会让你关闭没有观察员。


他们现在在插件中。

我还可以推荐一种替代方案,它可以为您提供如下控制器:

class PostsController < ApplicationController
  def create
    @post = Post.new(params[:post])

    @post.subscribe(PusherListener.new)
    @post.subscribe(ActivityListener.new)
    @post.subscribe(StatisticsListener.new)

    @post.on(:create_post_successful) { |post| redirect_to post }
    @post.on(:create_post_failed)     { |post| render :action => :new }

    @post.create
  end
end

我的建议是阅读James Golick的博文,网址是http://jamesgolick.com/2010/3/14/crazy-here-and-awesome-the-way-i-write-rails-apps.html(尝试忽略不妥协的标题听起来)。

早在这一天,它就是“胖胖的模特,瘦骨controller controller的控制者”。 然后,脂肪模型成为一个巨大的头痛,特别是在测试过程中。 最近推动一直是为了瘦身模型 - 这个想法是,每个类都应该处理一个责任,模型的工作就是将数据保存到数据库中。 那么,我所有复杂的业务逻辑最终会在哪里? 在业务逻辑类中 - 代表事务的类。

当逻辑开始变得复杂时,这种方法可能变成一个泥潭(giggity)。 然而,这个概念是合理的,而不是用难以测试和调试的回调或观察者隐式触发事物,而是在类中将触发事件显式触发,该类将逻辑置于模型之上。

链接地址: http://www.djcxy.com/p/60359.html

上一篇: Rails Observer Alternatives for 4.0

下一篇: Where do you put your Rack middleware files and requires?