这是我的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
我还可以做些什么来改进这些代码?
答案 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