我正在尝试为我的rails应用程序进行日志记录,并且在rails中使用哲学时遇到了一些困境。我的应用程序有Link
模型,has_many
Hit
S:Rails中的关注点困境的分离
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,引用,用户代理等)的数据,所以我需要传递请求对象到模型,但我认为这不符合“分离关注”和模糊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
虽然后一种情况下,使测试更容易(我并不需要模拟模型请求规格) - 它看起来不正确。
对此有任何意见 - 非常感谢。
P.S.方法被放置在需要的地方。它返回Hit
对象所需属性的散列。
好的答案,但不需要'重复'请求'只要它没有被修改,它不应该。 – PhilT 2016-03-18 16:49:28
就像我说的,偏执狂:)我担心有人(例如我)可能会迟一些来,并对模型方法内的请求对象进行一些更改,而不会意识到后果。但是,不是绝对必要的。 – 2016-03-18 16:51:00
然后你的代码就会被'dup'调用所抛弃。这被称为防御性编程。你最好明智地使用'freeze' – PhilT 2016-03-18 16:54:57