Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中的关注点分离困境_Ruby On Rails_Separation Of Concerns - Fatal编程技术网

Ruby on rails Rails中的关注点分离困境

Ruby on rails Rails中的关注点分离困境,ruby-on-rails,separation-of-concerns,Ruby On Rails,Separation Of Concerns,我正在尝试为我的rails应用程序进行日志记录,但在rails中使用的理念方面遇到了一些难题。我的应用程序有链接模型,其中有许多点击s: class Link < AR::Base has_many :hits end class Hit < AR::Base belongs_to :link end 这就是我困惑的地方。我想记录request对象(如远程ip、参考者、用户代理等)附带的数据,所以我需要将request对象传递给模型,但我认为这不符合“关注点分离”,并且模

我正在尝试为我的rails应用程序进行日志记录,但在rails中使用的理念方面遇到了一些难题。我的应用程序有
链接
模型,其中
有许多
点击
s:

class Link < AR::Base
  has_many :hits
end

class Hit < AR::Base
  belongs_to :link
end
这就是我困惑的地方。我想记录
request
对象(如远程ip、参考者、用户代理等)附带的数据,所以我需要将request对象传递给模型,但我认为这不符合“关注点分离”,并且模糊了MVC设计模式中的责任线(当然,如果我错了,请纠正我)。另外,如果我将在控制器本身中创建一个
命中
对象,那么我将制作skinny model and fat controller:

class LinksController < ApplicationController
  def hit
    hit_params = extract_data_from_request(request)
    Hit.create(hit_params.merge(:link_id => params[:id])
  end
end
类链接控制器params[:id])
结束
结束
尽管后一种情况使测试更容易(我不需要在模型规范中模拟请求),但它似乎并不正确

对此有任何建议-非常感谢


另外,
extract\u data\u from\u request(req)
方法被放置在需要的适当位置。它为
Hit
对象返回所需属性的散列。

就我个人而言,我会小心过度考虑这些事情

hit的概念与网站或web应用程序紧密相关,就像(HTTP)请求的概念一样。fat控制器反模式更多地是关于拥有包含ActiveRecord find语句和业务逻辑的冗长控制器操作(通常以
if
/
elsif
/
else
块为特征)可以很容易地提取到模型中


管制员有一定的编排职责。在一个管制员内创建对象并不是一种令人发指的罪行。毕竟,我们在
创建
操作中一直都在这样做。

就个人而言,我会小心过度考虑这些事情

hit的概念与网站或web应用程序紧密相关,就像(HTTP)请求的概念一样。fat控制器反模式更多地是关于拥有包含ActiveRecord find语句和业务逻辑的冗长控制器操作(通常以
if
/
elsif
/
else
块为特征)可以很容易地提取到模型中


控制器有一定的编排责任。在一个控制器中创建对象并不是一种令人发指的罪行。毕竟,我们在
创建
操作中一直都在这样做。

是的,我同意John的观点。请求的概念通常是“控制器的事情”,但在这种情况下,您的模型是对请求建模,所以它是确定的实际上,一旦请求对象从控制器跨越边界进入模型,它就只是另一个对象,没有特殊属性:它不再关心获取和响应html请求的过程,它只是一个可以做任何事情的对象

不过,有一点需要注意,在ruby中,参数是通过引用传递的。这意味着您在模型中操作的请求对象与控制器中处理的对象是同一个对象。我可能过于偏执(或者完全错了)但是您可能希望将它的副本传递给模型,而不是实际的请求本身

class LinksController < ApplicationController
  def hit
    link = Link.find(params[:id])
    link.hit!(request.dup)
  end
end
类链接控制器
是的,我同意John的观点。请求的概念通常是“控制器的东西”,但在这种情况下,您的模型是对请求进行建模的,因此在这种情况下它肯定在模型区域内。实际上,一旦请求对象从控制器跨越边界进入模型,它就是另一个对象,没有特殊属性:它是it’它不再关心获取和响应html请求的过程,它只是一个对象,您可以用它做任何事情

不过,有一点需要注意,在ruby中,参数是通过引用传递的。这意味着您在模型中操作的请求对象与控制器中处理的对象是同一个对象。我可能过于偏执(或者完全错了)但是您可能希望将它的副本传递给模型,而不是实际的请求本身

class LinksController < ApplicationController
  def hit
    link = Link.find(params[:id])
    link.hit!(request.dup)
  end
end
类链接控制器
回答得很好,但只要请求没有被修改,也不应该被修改,就不需要
dup
请求。就像我说的,偏执狂:)我会担心稍后会有人(例如我)在模型方法中对请求对象做一些更改,而不知道结果。但是,是的,不是严格必要的。那么你的代码就会被
dup
调用弄得乱七八糟。这就是所谓的防御性编程。明智地使用
freeze
会更好,因为在
Request
上没有任何方法可以修改它,所以这个调用是多余的。回答得好,但不需要重复
Request
,只要它没有被修改,也不应该被修改。就像我说的,偏执狂:)我会担心有人(比如我)稍后可能会出现,并在模型方法内对请求对象进行一些更改,而不知道结果。但是,是的,不是严格必要的。那么你的代码就会被
dup
调用弄得乱七八糟。这就是所谓的防御性编程。明智地使用
freeze
会更好,因为在
Request
上没有任何方法可以修改它,所以这个调用是多余的。