Ruby on rails 对Rails MVC感到困惑:为什么视图可以调用模型方法?

Ruby on rails 对Rails MVC感到困惑:为什么视图可以调用模型方法?,ruby-on-rails,oop,design-patterns,Ruby On Rails,Oop,Design Patterns,我得到了这个模型方法: class Post < ApplicationRecord def details "This post was created on #{created_at.strftime("%d %M %Y")}" end end 在视图中,我显示变量“test”第一段的值 <p> <%= @test %> </p> <p> <%= @post.details %> &

我得到了这个模型方法:

class Post < ApplicationRecord
    def details
        "This post was created on #{created_at.strftime("%d %M %Y")}"
    end
end
在视图中,我显示变量“test”第一段的值

<p>
  <%= @test %>
</p>

<p>
  <%= @post.details %>
</p>
而且,我可以直接从视图调用model方法。第二段

这让我很困惑,因为我认为那根本不可能

我认为只有控制器可以调用模型方法,并且它可以由控制器创建变量,这些变量随后在视图中可用。。。因此,模型和视图是分离和解耦的

但很明显,他们会将模型和视图合并在一起


当视图本身可以调用模型方法时,控制器有什么意义呢?

控制器的目的是协调给定请求或操作的相应响应。理想情况下,视图中没有重要的业务逻辑。控制器协调该活动(如运行查询、加载对象、启动后台作业等),然后将结果组织成数据,视图可以轻松使用这些数据进行渲染

然而,这并不意味着它们不能或不应该接收模型对象或调用模型对象上的方法。模型也与视图有关系。模型本身通常应该非常关注业务逻辑本身,大多数公共方法都是简单的属性获取程序。在许多情况下,控制器只需将模型实例传递给视图,并让视图提取显示所需的属性,就更简单、更清晰了。在这种情况下,控制器的角色是加载正确的模型、渲染正确的视图并将两者连接起来

例如,假设您有一个用户模型,其中包含标准的名称、出生日期等数据属性。在这种情况下,控制器通常只加载正确的用户对象,事实上Rails引导其许多视图助手围绕给定模型快速创建视图:

<%= form_for @person do |f| %>
  <%= f.label :first_name %>:
  <%= f.text_field :first_name %><br />

  <%= f.label :last_name %>:
  <%= f.text_field :last_name %><br />

  <%= f.submit %>
<% end %>
当您需要处理用于显示的数据时,控制器绝对是或至少是启动更复杂处理的地方。一个简单的例子是在呈现视图之前对用户数组进行排序

<%= form_for @person do |f| %>
  <%= f.label :first_name %>:
  <%= f.text_field :first_name %><br />

  <%= f.label :last_name %>:
  <%= f.text_field :last_name %><br />

  <%= f.submit %>
<% end %>