Не знаете, как насчет Rails MVC: почему представление может вызывать методы-модели? - PullRequest
0 голосов
/ 19 июня 2020

Я получил этот модельный метод:

class Post < ApplicationRecord
    def details
        "This post was created on #{created_at.strftime("%d %M %Y")}"
    end
end

В контроллере: я создаю переменную, которая имеет возвращаемое значение метода.

def show
    @test = @post.details
end

В представлении I отобразить значение переменной test (первый абзац).

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

<p>
  <%= @post.details %>
</p>

Но кроме того: Я могу вызвать метод-модель прямо из представления. Второй абзац ...

Это меня действительно смущает, потому что я думал, что это вообще невозможно.

Я думал, что только контроллер может вызывать методы модели и что он (контроллер) создает переменные , которые затем становятся доступными в представлении ... Чтобы модель и представление были разделены и развязаны.

Но так оно и есть (очевидно), модель и представление все равно объединятся.

Какой вообще смысл в контроллере, когда представление может вызывать само методы модели?

1 Ответ

1 голос
/ 19 июня 2020

Назначение контроллера - координировать соответствующий ответ на запрос или действие. В идеале просмотры не содержат значимых бизнес-логов c. Контроллер координирует эту деятельность - такие вещи, как выполнение запросов, загрузка объектов, запуск фоновых заданий и т. Д. c. - а затем организует результат в данные, которые представление может легко использовать для рендеринга.

Однако это не означает, что они не могут (или не должны) получать объекты модели или вызывать для них методы. Модели также связаны с представлениями. Сами модели обычно не должны касаться самих бизнес-логик c, при этом большинство методов publi c являются простыми получателями атрибутов. Во многих случаях проще и понятнее для контроллера просто передать экземпляр модели в представление и позволить представлению извлекать атрибуты, необходимые для отображения. Роль контроллера в этом случае - загрузка правильной модели, рендеринг правильного представления и соединение этих двух.

Например, предположим, что у вас есть модель User, в которой стандартный вид имени, даты рождения и любых атрибутов данных. В этом случае контроллер обычно просто загружает правильный объект User, и фактически 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 %>

Контроллер является абсолютно подходящее место для (или, по крайней мере, место для инициирования) более сложной обработки, когда вам нужно обрабатывать данные для отображения. Простым примером этого может быть сортировка массива Users перед рендерингом представления.

...