2012-10-06 80 views
0

這是我after_create回調:如何重構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 

我還有什麼可以做,以改善該代碼?

回答

3

多數認爲應該去Notify。我認爲這是一個Follow類。在重構過程中問自己的一個有用的問題是「這個課程是否需要知道這種行爲?」,我認爲在這種情況下答案是否定的。試着做這樣的事情:

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

...和分支邏輯是在通知,他們的工作是找出要發送的通知的其餘部分。

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 
相關問題