RubyonRails模型、视图和控制器之间的关系

RubyonRails模型、视图和控制器之间的关系,ruby,ruby-on-rails-3,model-view-controller,Ruby,Ruby On Rails 3,Model View Controller,根据我目前的理解,如果我必须描述rails应用程序的各个组件如何协同工作以响应请求,我会说: 1) 路由确定哪些请求URL映射到哪些控制器方法 2) 控制器方法从模型中获取信息,并将该信息(以全局变量的形式)传递给相应的视图模板 3) 视图模板使用存储在全局变量中的数据来构造最终响应 在上述解释中,几个组成部分之间的关系是明确和不可否认的;即: 1) 路由和控制器方法 2) 控制器方法和视图模板 事实上,上述关系是1对1的 但是,模型类与其相邻组件类型(即控制器)之间的关系并不清楚。是的,控制器

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

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

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

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

在上述解释中,几个组成部分之间的关系是明确和不可否认的;即:

1) 路由和控制器方法

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

事实上,上述关系是1对1的

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

1) 控制器不一定需要从模型中检索信息,就像静态网站一样

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

因此,可以准确地说,模型与其他组件的存在稍有不同吗?可以准确地说,模型类共同构成应用程序后端的后端,而其他组件(即路由、控制器方法和视图模板)构成紧密耦合的线性机制,其中控制器根据需要插入模型类中吗?更具体地说,至少在rails组件实际装配的上下文中,在任何给定的控制器和任何给定的模型(例如UserController和User)之间没有自然关系,这样说是否准确

是的,我知道rails附带了“resources”关键字,用于在routes文件中生成RESTful路由,并且rails中的工作通常是以RESTful方式完成的。可以说rails适合于RESTful web应用程序的开发。在RESTful应用程序的上下文中,模型和控制器彼此隐式相关。但这只是对REST架构风格的描述。我想问一下rails。在我看来,在rails本身中,模型与控制器的关系仅限于在控制器方法的实现中使用模型的程度——因为软件中的代码组织是任意的,所以这些关系是任意的

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


有人能证实或反驳我的话吗?

创建独立的控制器很好。您还可以创建一条路径,指向您的
userscoontroller#show
操作,并在用户查看自己的个人资料时处理该情况

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


在您的情况下,可能您只需要一个不同的路由(例如:
www.example.com/me
),这并不意味着操作逻辑不能在
userscoontroller
中。最后,我们要做的就是将相似的逻辑保留在一个地方,以便更易于维护。

有关MVC的详细说明,请查看Jeff Atwood的帖子:

现在,对于你的应用程序,一个控制器可以显示用户的个人资料页面。要确保安全性,您应该做的是,对于UsersController#show action(配置文件页面),您应该验证它是否是当前用户,否则将重定向,或显示错误消息,或显示可编辑页面,等等

@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 %>

#单击此处的“编辑”按钮,进入“设置”页面
#按这里的按钮

当前用户应该是在应用程序控制器中定义的帮助程序方法

模型表示数据库表,控制器在模型和视图之间进行编排。这种关系是一对一的,没有具体的原因或限制。事实上,除了最简单的应用程序之外,它在大多数应用程序中可能都不存在,尽管在开发时它通常是一个合理的起点,这也是Rails将以这种方式构建新应用程序的原因。感谢您的回复。它知道它会“很好”,但我不相信它会是理想的。例如,您的解决方案如何处理显示其他用户的配置文件页面?您的解决方案将如何处理显示当前用户的配置文件页面,而其他用户将看到它?好问题。我已经更新了我的答案。以GitHub为例。访问您自己的个人资料页面,您会看到与其他人相同的页面,但是您没有“跟随”按钮,而是有一个“编辑个人资料”按钮。对于几乎相同的页面,他们不太可能使用不同的控制器。然后,您可以执行一个“编辑”操作,将您指向您的设置,但在那里,您可以将某人重定向为潜在的恶意用户,而不是显示修改后的版本。至于何时创建控制器:再次感谢您的回复。我来到了我想创建的页面的rlztn