我怎样才能重构after_create回调?

时间:2012-10-06 19:25:50

标签: ruby-on-rails ruby-on-rails-3 callback refactoring

这是我的after_create回调:

after_create { |f| if f.target.class.eql?(Question)  
        if f.target.user != User.current_user
          Notify.create_notify( Notify::QUESTION_FOLLOW, f.target.user, User.current_user, f.target) 
        end
      elsif f.target.class.eql?(User)   
        Notify.create_notify( Notify::USER_FOLLOW, f.target, User.current_user,f.target)  if f.target.can_mail_user(:follower) 
      end 
  } 

我尝试将其移到块中,所以现在看起来如下:

after_create do |f| 
  if f.target.class.eql?(Question)  
    if f.target.user != User.current_user
      Notify.create_notify( Notify::QUESTION_FOLLOW, f.target.user, User.current_user, f.target) 
    end
  elsif f.target.class.eql?(User)   
    Notify.create_notify( Notify::USER_FOLLOW, f.target, User.current_user,f.target)  if f.target.can_mail_user(:follower) 
  end 
end 

我还可以做些什么来改进这些代码?

2 个答案:

答案 0 :(得分:3)

大多数应该转到Notify。我假设这是一个Follow类。在重构中问自己一个有用的问题是“这个类需要知道这个行为吗?”,我认为在这种情况下答案是否定的。尝试做这样的事情:

after_create do |f|
  Notify.create_notify(f.target.user, User.current_user, f.target)
end

...其余的分支逻辑进入Notify,其工作是找出要发送的通知。

答案 1 :(得分:0)

改善它的一种方法是使用is_a?方法而不是直接比较类名。此外,变量f不够具有描述性。最后,我创建了一个新的变量来存储f.target,这样你就不用重复了。

例如:

after_create do |record| 
  target = record.target
  if target.is_a?(Question) 
    if target.user != User.current_user
      Notify.create_notify( Notify::QUESTION_FOLLOW, target.user, User.current_user, target) 
    end
  elsif target.is_a?(User)   
    Notify.create_notify( Notify::USER_FOLLOW, target, User.current_user, target)  if target.can_mail_user(:follower) 
  end 
end