【发布时间】:2010-07-06 12:02:59
【问题描述】:
我正在尝试为我的 rails 应用程序进行日志记录,但对 rails 中使用的哲学存在一些困境。我的应用程序有 Link 模型 has_many Hits:
class Link < AR::Base
has_many :hits
end
class Hit < AR::Base
belongs_to :link
end
现在每次点击链接时,我都会调用hit! 方法来记录链接上的请求(为了保持控制器瘦我让模型变胖):
class LinksController < ApplicationController
def hit
link = Link.find(params[:id])
link.hit!(request)
end
end
class Link < AR::Base
def hit!(request)
params = extract_data_from_request(request)
hits.create(params)
end
end
现在我很困惑。我想记录 request 对象附带的数据(如远程 ip、referrer、用户代理等),因此我需要将请求对象向下传递给模型,但我认为这不符合“关注点分离” " 并且模糊了 MVC 设计模式中的责任界限(当然,如果我错了,请纠正我)。另外,如果我要在控制器本身中创建一个Hit 对象,那么我正在制作瘦模型和胖控制器:
class LinksController < ApplicationController
def hit
hit_params = extract_data_from_request(request)
Hit.create(hit_params.merge(:link_id => params[:id])
end
end
虽然后一种情况使测试更容易(我不需要在模型规范中模拟请求) - 它似乎并不正确。
对此的任何建议 - 非常感谢。
附: extract_data_from_request(req) 方法放置在需要的适当位置。它返回 Hit 对象所需属性的哈希值。
【问题讨论】:
标签: ruby-on-rails separation-of-concerns