你在观点中加入了多少逻辑?

时间:2009-08-01 15:01:44

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

我目前不自信,如果我可以在我的视图中加入“if / else”-construct?

你在观点中加入了多少逻辑?

我的困境:

我正在渲染导航。所以,我必须区分当前/活动菜单项和其他菜单项。当前菜单项获得一个特殊的css类。我不知道如何以比使用if-else更好的方式处理这个问题。

8 个答案:

答案 0 :(得分:4)

如果你正在做MVC(希望你这样做),那么问题是“我是否将逻辑放在视图或控制器中?”。我用一个简单的规则来找出答案:

如果我的视图不是HTML,而是XML文档怎么办? 如果我在两种情况下都需要这种逻辑 - 它的位置在控制器中。如果不是 - 它在视图中。

在良好的MVC设计中,您应该能够在不触摸控制器的情况下交换视图。

答案 1 :(得分:2)

尽可能多地显示信息。请记住,视图只是进入程序内部状态的窗口。如果你完全剥离了视图层,那么程序仍然可以像往常一样操作,只是无法看到它正在做什么。

编辑:重新导航,这似乎可以使用if语句。有关哪些信息的信息仍来自模型,您只需使用if语句来决定如何显示它。您可能会考虑一下如何渲染导航:有关可用的导航项目以及在视图或模型中生成哪些导航项目的信息?

您可能选择接近这种情况的一种方法是让模型为您提供导航项列表以及哪一项处于活动状态,并对视图进行编程以了解如何从中生成适当的HTML。该代码可能恰好包含一个if语句总数。 (而不是每个导航项目一个)。

答案 2 :(得分:1)

我不担心在视图中放置if语句。事实上,我认为(在一般情况下)对这些情况下的责任感到有些过分担忧。

如果你的观点太愚蠢,那么你的模型就会变得过于观察(紧密耦合)。

恕我直言,一个观点可以做它喜欢的事情,但指导原则应该是:它从何处获取信息?如果答案是“模型”,那么使用尽可能多的逻辑。

答案 3 :(得分:1)

如果视图是交替模式,则“if / else”构造是正常的,例如在订单屏幕中格式化美国地址与外国地址。

但是,放入视图的任何逻辑都不应改变模型。

答案 4 :(得分:1)

将此助手添加到您的application_helpers.rb如果该链接是当前页面,则会将<li><li class="active">包围在您的链接中。

用它代替link_to。

link_to 'home', root_url, optional_condition_argument_goes_here

def active_link_to(text, url, condition = nil)
  if condition.nil? and String === url
    condition = url == request.path
  end
  content_tag :li, link_to(text, url), :class => (condition && 'active')
end

(由Mislav提供)

答案 5 :(得分:0)

我可能会在视图中添加if-else。在大多数情况下没有。在我看来,真正的问题是逻辑是否可以在没有其他任何问题的情况下进入其他任何地方。

答案 6 :(得分:0)

我倾向于避免在我的视图中使用控制流逻辑(ASP.NET MVC),除非在我可能希望基于数据的存在与否存在可见/不可见的部分界面的情况下。在这种情况下,它是视图逻辑 - 我正在确定页面的布局,可用页面的元素等等。我认为这是完全可以接受的,并且最好让控制器确定这个或将视图相乘帐户的小变种。控制器需要为视图提供足够的信息,以便能够根据需要呈现视图及其变体。

我不会在视图中加入的是业务逻辑,它决定了如何计算某些内容或是否执行某些操作(可能除了基于角色的决策之外 - 这些似乎几乎无处不在)。除了客户端验证之外,我的业务逻辑还存在于控制器/模型中。

我可能会在视图中使用if / then逻辑的示例是显示事件的视图。在我的应用程序中,事件可以有子事件,但子事件不能有其他子事件:两级层次结构。在我的显示页面上,我有详细信息,组,参与者和Subevents的选项卡。除了Subevent选项卡之外,它们对于事件和子事件都是相同的。它不应该存在于子事件中。我没有通过两个不同的视图重复自己,除了那个选项卡之外几乎完全相同,我在视图中添加了少量逻辑,如果事件没有,则不会呈现Subevent选项卡。

出于同样的原因,我不会有一个单独的“视图”,它使用逻辑来确定是否根据某些视图数据项的值来显示概述或细节或编辑窗格等。 。这似乎是对适用于观点的单一责任原则的滥用。每个视图都应该有一个单一用途的IMO。

答案 7 :(得分:0)

不应要求视图中的逻辑完全描述模型的当前状态。

换句话说,如果该逻辑用于格式化或改变信息的可视化,则视图中的逻辑是可接受的。视图中的逻辑也可用于审查在将数据传输到控制器(在客户端/服务器或Web应用程序中)之前输入的数据。

例如,视图可能包含在列表长于N个项目时将项目列表拆分为多个列的逻辑。根据视图的确切性质(例如,http,移动设备,pdf,语音阅读器,Morris Code等等,ad nasium),可以以几种不同的方式完成该分割。可能需要对完整视图信息进行分页 - 这只能在视图中完成。格式化逻辑不应包含在控制器或模型中。

作为一个极端情况,视图可能包含逻辑,以检查为新用户输入的密码是否满足当前的安全要求(例如,密码匹配的双重输入;至少N个字符长;不包括空格或“* “字符;包括以下至少三个:小写字母,大写字母,数字,符号;不同于最后N个密码,不基于字典单词等,等等)。根据逻辑的性质,审查密码可以被认为是“格式化”或“业务逻辑”。可能是检查在两次传递中发生 - 一组检查视图中的格式,另一组检查控制器中的信息来自模型(最后N个密码)。