【问题标题】:Could I not use instance variables?我可以不使用实例变量吗?
【发布时间】:2021-08-27 08:03:55
【问题描述】:

我是 Rails 新手,我有一个问题。大家都说迭代表的首选方式是通过Controller在实例变量中捕获数据,然后在对应的View中进行迭代。

如果我这样做了会怎样

<% Course.all.each do |course| %>
  <!-- displays list of courses -->
<% end %>

我知道使用实例变量是首选方式,但有什么原因吗?

【问题讨论】:

  • 这是为了保持你的代码模块化。想象一下为您的视图编写一个测试。使用变量,您只需要为@courses 传递一些静态示例数据。使用Course.all,您必须处理实际的数据库访问,这需要填充数据库或存根调用。

标签: ruby-on-rails ruby model-view-controller


【解决方案1】:

我不能使用实例变量吗?

是的。正如您编写的那样,代码有效

使用实例变量是首选方式,但有什么原因吗?

这实际上只是一种约定的设计模式,避免直接在视图中进行数据库查询。

一个principle of MVC frameworks is to have the controller prepare all data for the view,而不是视图直接在任意点获取数据。从长远来看,您会发现后一种方法可能会变得混乱、性能不佳且难以维护。

例如,您可能会开始多次执行相同的查询,或者遇到N+1 问题,或者根本难以测试实现(因为如果逻辑都在视图中,唯一的测试方法可能是通过非常复杂+昂贵的功能测试,而不是快速简单的单元测试!) - 这会使实现变得脆弱且容易出错。

但是规则是用来打破的,你可以在rails中写出这样的代码;只是从最初发明 MVC 框架的开发人员的过去经验中得到一个警告:这通常是一种应该避免的设计模式。

【讨论】:

  • 非常感谢 :)
【解决方案2】:

您当然可以这样做,但这并不意味着这是一个好主意。

Rails 作为一个 MVC 框架运行,它将模型、视图和控制器分开,这实际上是 "Separation of Concerns" 设计原则的应用。

通过将控制器职责(获取数据)添加到视图职责(显示数据和与用户交互)中,您将更加难以重用视图代码。

  • 如果您只想显示部分课程而不是全部课程,而是使用相同的格式,该怎么办?
  • 如果您想根据当前用户的身份显示一组不同的课程怎么办?
  • 如果您因为已有 1,000 门课程而想要对课程列表进行分页怎么办?

等等。

当你刚开始时,这真的很难理解,但尽早养成这个习惯可以避免你以后忘记它。

归根结底,这些只是惯例,您可以在某个时间和地点打破惯例,但请注意,所有这些“违反规则”最终可能会卷土重来并困扰您。这就是我们所说的“技术债务”,与任何类型的债务一样,你持有的时间越长,就越难偿还。

【讨论】:

  • 是的,我现在明白了。我以前用过一些这样的东西,比如分页。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2012-04-30
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
相关资源
最近更新 更多