Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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_Ruby_Ruby On Rails 4_Exception Handling_Rails Activerecord - Fatal编程技术网

Ruby on rails 在rails中将多个查询链接在一起时,如何很好地处理异常?

Ruby on rails 在rails中将多个查询链接在一起时,如何很好地处理异常?,ruby-on-rails,ruby,ruby-on-rails-4,exception-handling,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Exception Handling,Rails Activerecord,在我的几个控制器中,我有如下代码: @user .cars.find_by_id(params[:car_id]) .try(:wheels).find_by_id(params[:wheel_id]) .try(:screews).where(id: ids) 这当然会引发nil:NilClass的异常:nomethoderor:undefined方法'where'。我希望能够向我的用户提供更多关于出错原因的信息,在这种情况下,用户没有指定id的汽车 将find_by_id更改为

在我的几个控制器中,我有如下代码:

@user
  .cars.find_by_id(params[:car_id])
  .try(:wheels).find_by_id(params[:wheel_id])
  .try(:screews).where(id: ids)
这当然会引发nil:NilClass的异常:nomethoderor:undefined方法'where'。我希望能够向我的用户提供更多关于出错原因的信息,在这种情况下,用户没有指定id的汽车


将find_by_id更改为find将导致上面的代码引发ActiveRecord::RecordNotFound异常,我可以处理该异常,但在这种情况下,我如何确定汽车或车轮是否丢失?RecordNotFound异常实际上并不包含那么多信息。有什么好办法处理好这类事情吗?最好是一些足够通用的东西,以便我可以轻松地在其他控制器中重用代码。

ActiveRecord::RecordNotFound异常有一条消息,即找不到id=200的用户,因此您可以使用它来告诉您找不到哪个模型


只需拯救该异常,并使用该消息向用户显示信息。您可以在消息中搜索模型名称,如果愿意,可以显示自定义提示。

ActiveRecord::RecordNotFound异常有一条消息,即找不到id=200的用户,因此您可以使用它告诉您找不到哪个模型


只需拯救该异常,并使用该消息向用户显示信息。您可以在消息中搜索模型名称,如果愿意,可以显示自定义提示。

我认为您的代码有味道,您应该重构它

  • 每个单元对其他单元的了解应有限:仅与当前单元“密切”相关的单元
  • 每个单位只能和朋友交谈;不要和陌生人说话
  • 只和你的直系朋友交谈

我并不是说你需要崇拜德米特定律或其他CS概念,而是在这种情况下捕捉到例外情况并不能使情况变得更好,而是像在一个有斑点的地基的塔楼周围建立一个安全网,这样居民就可以在倒塌时跳出窗外。 让我们一行一行地看一遍:

@user
  .cars.find_by_id(params[:car_id])
  .try(:wheels).find_by_id(params[:wheel_id])
  .try(:screews).where(id: ids)
.find_by_id
是一种所谓的动态查找方法,它依赖于从Rails 4的核心中提取的方法缺失。改用
.find
,它是向前兼容的,并且没有缺少metamagic的方法的开销

我们不需要从
@user
确定查询范围,因为我们已经有了一个唯一的汽车id

Car.find(params[:car_id])
  .try(:wheels).find_by_id(params[:wheel_id])
  .try(:screews).where(id: ids)
如果我们想同时获取
汽车
车轮
,我们应该使用连接查询来进行有效的SQL查询

Car.joins(:wheels)
   .where(id: params[:wheel_id])
   .find(params[:car_id])
但如果我们真正需要的是螺丝,我们可以这样做:

# Doing a JOIN to cars requires a 
# has_many :cars, through: :wheels relationsship
@screws = Screw.where(id: ids).joins(:cars, :wheels)
因此,我重申:

  • 当您有唯一的ID时,不要通过父级定义查询的范围-您只是
  • 用于创建更高效的查询
  • 使用异常来处理异常情况,而不是正常的程序流

我想说您的代码有味道,您应该重构它

  • 每个单元对其他单元的了解应有限:仅与当前单元“密切”相关的单元
  • 每个单位只能和朋友交谈;不要和陌生人说话
  • 只和你的直系朋友交谈

我并不是说你需要崇拜德米特定律或其他CS概念,而是在这种情况下捕捉到例外情况并不能使情况变得更好,而是像在一个有斑点的地基的塔楼周围建立一个安全网,这样居民就可以在倒塌时跳出窗外。 让我们一行一行地看一遍:

@user
  .cars.find_by_id(params[:car_id])
  .try(:wheels).find_by_id(params[:wheel_id])
  .try(:screews).where(id: ids)
.find_by_id
是一种所谓的动态查找方法,它依赖于从Rails 4的核心中提取的方法缺失。改用
.find
,它是向前兼容的,并且没有缺少metamagic的方法的开销

我们不需要从
@user
确定查询范围,因为我们已经有了一个唯一的汽车id

Car.find(params[:car_id])
  .try(:wheels).find_by_id(params[:wheel_id])
  .try(:screews).where(id: ids)
如果我们想同时获取
汽车
车轮
,我们应该使用连接查询来进行有效的SQL查询

Car.joins(:wheels)
   .where(id: params[:wheel_id])
   .find(params[:car_id])
但如果我们真正需要的是螺丝,我们可以这样做:

# Doing a JOIN to cars requires a 
# has_many :cars, through: :wheels relationsship
@screws = Screw.where(id: ids).joins(:cars, :wheels)
因此,我重申:

  • 当您有唯一的ID时,不要通过父级定义查询的范围-您只是
  • 用于创建更高效的查询
  • 使用异常来处理异常情况,而不是正常的程序流

如果您想要不同的消息,请创建您的自定义异常如果您想要不同的消息,请创建您的自定义异常如果您想要不同的消息,即使我有唯一的ID,我仍然希望确保汽车属于当前用户。然后从用户处确定查询范围。但是你不应该使用这个链式怪物。注意,这似乎是一个巨大的误解,
find\u by\u…
(在这种情况下,
find\u by\u id
)并没有贬值<代码>按查找…和
按查找实际上是唯一没有折旧的动态查找程序。另外,如果他要重构这个
find_by(id:params[:id]),
作为重构比
find
更一致,因为
find
将在哪里引发as
find_by
将返回第一个匹配记录或
nil
就像
find_by
一样。@engineersmnky感谢您的澄清,我在API文档(我相信是4.2)中查找
find_by_id
,但找不到它,因此我假设它是一个动态查找器。尽管我有唯一的id,但我仍然希望确保该车属于当前用户。然后从用户处确定查询范围。但是你不应该使用这个链式怪物。作为一个注释,因为这似乎是一个巨大的误解