这是重构的正确方法吗?我能做的更好吗?

时间:2011-06-15 16:28:54

标签: ruby-on-rails-3 refactoring

我制作了一个Impressions模型,用于跟踪某张照片或事件的“观看次数”。它通过remote_url,remote_ip和user_agent跟踪它。它按我想要的方式工作。

照片控制器:

def show

  @photo.impressions.create(:request_url => request.url, :controller_name => controller_name, :action_name => action_name,
                            :ip_address => request.remote_ip, :user_agent => request.user_agent)
....

我的事件控制器:

def show

  @event.impressions.create(:request_url => request.url, :controller_name => controller_name, :action_name => action_name,
                            :ip_address => request.remote_ip, :user_agent => request.user_agent)
....

但是,我正在考虑重构这个(使代码更清晰)。也许在名为Photo的{​​{1}}和Event模型中创建方法。这与上面完全相同,但封装了如何创建展示的功能。它看起来像是:

照片控制器:

add_impression

我的事件控制器:

def show

  @photo.add_impression(request.url, controller_name, action_name, request.remote_ip, request.user_agent)
....

通过这种方法,我最终会在def show @event.add_impression(request.url, controller_name, action_name, request.remote_ip, request.user_agent) .... Photo模型中使用add_impression方法。不完全干(不要重复自己)。我正在考虑创建一个Event模块来解决这个问题。

这是正确的做法吗?或者我还应该做些什么呢?

PS 我对模块的调整还不是很好。因此,如果有人想留下代码片段或链接到值得阅读的文章。请这样做。

1 个答案:

答案 0 :(得分:3)

就我个人而言,我会让Impression负责使用类方法创建一个印象:

class Impression < ActiveRecord::Base

  def self.add_impression impressionable, options
    impressionable.impressions.create options
  end

end

然后在控制器中:

Impression.add_impression @photo, options