【问题标题】:Ruby On Rails Relationship Between Model, View, And Controller模型、视图和控制器之间的 Ruby On Rails 关系
【发布时间】:2015-02-26 02:41:46
【问题描述】:

根据我目前的理解,如果我必须描述 Rails 应用程序的各个组件如何协同工作以响应请求,我会说以下内容:

1) 路由决定哪些请求 URL 映射到哪些控制器方法。

2) 控制器方法从模型中获取信息并将该信息(以全局变量的形式)传递给相应的视图模板。

3) 视图模板使用存储在全局变量中的数据来构造最终响应。

在上面的解释中,几个组件之间的关系是清楚的,不可否认的;即:

1) 路由和控制器方法

2) 控制器方法和视图模板

其实上面的关系是一对一的。

但是,模型类与其相邻组件类型(即控制器)的关系并不那么清楚。是的,控制器从模型中检索信息,但请考虑以下几点:

1) 控制器不必像静态网站那样从模型中检索信息。

2) 控制器可以从多个模型类中检索信息。

因此,是否可以准确地说模型与其他组件的存在稍微分开一些?准确地说,模型类构成了应用程序后端的后端,而其他组件(即路由、控制器方法和视图模板)构成了紧密耦合的、控制器根据需要进入模型类的线性机制?更具体地说,是否可以准确地说,至少在 rails 组件如何实际组合在一起的情况下,任何给定的控制器和任何给定的模型(例如 UserController 和 User)之间都没有自然关系?

是的,我知道 rails 带有“resources”关键字,用于在路由文件中生成 RESTful 路由,并且通常在 rails 中以 RESTful 方式完成工作。您可以说 Rails 适合于 RESTful Web 应用程序的开发。并且在 RESTful 应用程序的上下文中,模型和控制器之间是隐式相关的。但这是对 REST 架构风格的描述。我问的是铁轨。在我看来,在 Rails 本身中,模型仅与控制器相关,因为模型用于实现控制器的方法 - 因为软件中的代码组织是任意的,所以这些关系是任意的。

我正在考虑这些事情,因为我想为用户添加一种查看自己个人资料的方式。我已经有一个用户模型和一个控制器以及用于显示用户信息的视图。个人资料页面将显示来自用户模型的信息,但我不想为用户自己的个人资料使用相同的控制器或视图,就像我在显示有关其他用户的信息时所做的那样。因此,我计划为配置文件创建一个新的控制器和视图,但使用 User 模型来检索显示的信息。这是一个任意决定,就像构建应用程序时做出的其他任意决定一样。但是,如果由于某种原因模型和控制器应该在 rails 中保持紧密耦合(例如 1 对 1),这将不是一个有效的决定。

谁能证实或反驳我所说的?

【问题讨论】:

  • 一个模型代表一个数据库表,控制器在模型和视图之间进行编排。这种关系是一对一的,没有具体的原因或限制。事实上,它可能只存在于最简单的应用程序中,尽管它通常是开发时一个合理的起点,这就是 Rails 会以这种方式构建新应用程序的原因。

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


【解决方案1】:

有关 MVC 的详细解释,请查看 Jeff Atwood 的帖子:http://blog.codinghorror.com/understanding-model-view-controller/

现在,对于您的应用,一个控制器就可以很好地显示用户的个人资料页面。为了确保安全,您应该做的是,对于 UsersController#show 操作(个人资料页面),您应该验证它是当前用户,否则重定向,或显示错误消息,或显示可编辑页面等。

@user = User.find(params[:id])
if current_user != @user
  render :show
else 
  render :self_profile
end

您可以使用的另一种方法是:

@user = User.find(params[:id])
if current_user != @user
  @authenticated_user = true
end
render :show

然后在你的视图模板中,你可以有一个条件:

<% if @authenticated_user %>
  #Edit button here, takes you to the settings page
<% else %>
  #Follow button here
<% end %>

current_user 应该是应用程序控制器中定义的 helper_method。

【讨论】:

  • 感谢您的回复。它知道它会“很好”,但我不相信它会是理想的。例如,您的解决方案将如何处理显示其他用户的个人资料页面?您的解决方案将如何处理显示当前用户的个人资料页面,因为其他用户会看到它?
  • 好问题。我已经更新了我的答案。例如,看看 GitHub。访问您自己的个人资料页面,您会看到与其他人相同的页面,但您有一个“编辑个人资料”按钮,而不是“关注”按钮。他们不太可能对几乎相同的页面使用不同的控制器。然后,您可以使用“编辑”操作将您定向到您的设置,但您可以在那里将某人重定向为潜在的恶意用户,而不是显示修改后的版本。至于何时创建控制器:stackoverflow.com/questions/8049837/…
  • 再次感谢您的回复。我已经来到 rlztn,我想创建的页面将更准确地作为“帐户仪表板”而不是用户 prfile。此外,我认为用户配置文件的cncpt 中固有的一种假设是它旨在由用户本人以外的其他人查看。用户只会查看他自己的 prfle 以查看 anthr 用户会看到什么。用户需要在他的 prfle 上管理 dsplyed 的信息是某种 dshbrd。所以,我想我会为用户个人资料页面使用 UsersController 的显示操作,并制作一个单独的帐户仪表板页面。
  • 是的。你说对了。帐户仪表板页面可以是用户控制器上的“编辑”操作。这是相当普遍的。这之所以有意义是因为它遵循 RESTful 架构。您的“资源”是用户。仪表板页面仅用于编辑“用户”,您没有编辑任何其他内容。这是我的建议,希望对您有所帮助。
  • 再次感谢您的回复。我想到了将 UsersController 中的“编辑”操作用于“帐户仪表板”页面,但我设想的帐户仪表板页面将成为用户可以通过该页面执行的许多不同操作的起点网站。编辑他的个人资料上显示的信息只是其中一项操作。因此,我仍然认为需要仪表板控制器,仪表板将链接到用于编辑用户信息的页面(通过 UsersController 的编辑操作生成)。您如何看待这种方法?
【解决方案2】:

创建独立的控制器很好。您还可以创建一个指向您的 UsersController#show 操作的路由,并在用户在那里查看他或她自己的个人资料时处理这种情况。

在一个重要的应用程序中,您最终会得到与资源不匹配的控制器和没有控制器的模型,这没关系。

在你的情况下,也许你想要的只是一条不同的路线(例如:www.example.com/me),这并不意味着动作逻辑不能在UsersController 中。最后,这一切都是为了将​​相似的逻辑保存在一个地方,以便更容易维护。

【讨论】:

  • 感谢您的回复。您的回答涉及到我的另一个问题:什么情况下适合创建新的控制器?换句话说,控制器类在逻辑上代表什么?真正的关系是在控制器类中定义的路由和方法之间。一个应用程序可以只有一个控制器并且可以正常工作。到目前为止,我已经看到不同的控制器用于不同的模型(例如,用于用户的用户控制器、用于帖子的 PostsController 等)。哪一种让我回到我在这个页面上提出的原始问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 2015-06-06
  • 2011-12-28
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
相关资源
最近更新 更多