gpt4 book ai didi

Ruby On Rails 模型、 View 和 Controller 之间的关系

转载 作者:数据小太阳 更新时间:2023-10-29 07:08:29 25 4
gpt4 key购买 nike

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

1) 路由确定哪些请求 URL 映射到哪些 Controller 方法。

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

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

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

1) 路由和 Controller 方法

2) Controller 方法和 View 模板

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

但是,模型类与其相邻组件类型(即 Controller )的关系并不明确。是的, Controller 从模型中检索信息,但请考虑以下几点:

1) Controller 不一定需要像静态网站那样从模型中检索信息。

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

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

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

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

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

最佳答案

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

现在对于您的应用程序,一个 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

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

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

current_user 应该是在应用程序 Controller 中定义的 helper_method。

关于Ruby On Rails 模型、 View 和 Controller 之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27696882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com