Rails .create () против контроллера # create - PullRequest
2 голосов
/ 26 апреля 2011

Это вопрос новичка в Rails:

Когда я вызываю create() для модели, она обходит действие соответствующего контроллера create?

Например, это не такпоразить мой контроллер теговвызовите действие контроллера и всегда запускайте код в нем при создании, но, очевидно, это только во время POST к этому маршруту.

Что мне здесь не хватает?

Редактировать:

Есть ли способ сделать этот вызов, чтобы убедиться, что контроллер создания кода запущен?У меня есть некоторый код, чтобы найти тег с помощью постоянной ссылки и создать новый, если необходимо, в противном случае повторно использовать существующий.Использование model.create () не запускает этот код.Я мог бы "делать это неправильно", хотя: P

Ответы [ 4 ]

5 голосов
/ 26 апреля 2011

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

Контроллеры и модели отключены, но только логически связанные классы.

Если у вас есть код, который вы хотите сделать доступным для всех пользователей вашей модели, добавьте метод в модель.Затем вызовите этот метод из вашего контроллера, и в любом другом месте вы захотите такое поведение.

3 голосов
/ 26 апреля 2011

Rails работает по схеме проектирования MVC.M - это модель, которая обычно является классами ORM.В Rails ActiveRecord является ORM по умолчанию, и каждая модель сопоставляется с таблицей в базе данных.Это где мясо вашей логики должно быть.Модели ничего не знают о большом мире, откуда они вызываются, например, из Интернета, веб-страницы или контроллера.

Контроллер формирует C MVC.Это конечные точки ваших веб-приложений.Каждый раз, когда URL-адрес вызывается из браузера, он попадает в конечную точку контроллера.Действие контроллера «создать» является конечной точкой.Этот метод чаще называют «действием».Задача действия контроллера «создать» должна состоять в том, чтобы организовать создание объектов, обработку и упаковку ошибок, а затем перенаправить в другое место или отправить ответ обратно, используя Представления.

Представление формирует V из MVC.Не хочу углубляться в V, так как это не имеет отношения к вашему вопросу, и я предполагаю, что вы уже знаете его.

Таким образом, метод «создания» вашей Модели, предоставляемый ActiveRecord, значительно отличается от действия «создания» контроллера.,Действие создания в контроллере может вызывать метод создания в модели как часть его оркестровки.

Это общепринятая практика - держать "контроллеры скинни" и "модели жирные".Убедитесь, что действие вашего контроллера ограничено до нескольких строк (обычно 5-6 строк для действия создания).Часть вашей логики программы должна быть в самой модели.

Не пытайтесь вызвать действие контроллера «создать» при вызове user.tags.create.Только запросы веб-браузера отправляются на контроллер.

2 голосов
/ 26 апреля 2011

user.tags.create вызывает метод ActiveRecord#create, унаследованный в Tags, и это то, что TagsController#create предоставляет доступный интерфейс.

ActiveRecord#create создает новый объект модели и затем сохраняет его, не имея ничего общего с представлением или контроллером,

Controller#create, вероятно, вызывает модель create, если права доступа правильны, параметры и т. Д., Но это происходит в ответ на POST с веб-конца

В основном модель и контроллер являются двумя отдельными объектами и взаимодействуют через свои методы

Подробнее о методологии MVC

2 голосов
/ 26 апреля 2011

Вы правы. ModelClass # create не имеет ничего общего с контроллером.

Работа контроллера заключается в том, чтобы реагировать на ввод или «действие», выполнять любые действия, связанные с моделью, а затем устанавливать сцену для отображения вида (выбранного методом / действием контроллера) для отображения. подробности.

На высоком уровне работа модели заключается в инкапсуляции данных и, в случае моделей на основе ActiveRecord, в передаче данных между структурами данных на основе памяти («моделями») и постоянным хранилищем (базой данных).

Исходя из ваших правок, мне кажется, что вы хотите запустить метод Tags # create, чтобы выполнить некоторую работу с данными. Это было бы более уместно сделать в модели IMO, поскольку кажется, что вы делаете вещи, связанные исключительно с данными, и вам не нужен полный «цикл MVC», связанный с вызовом метода контроллера. Можете ли вы выполнить то, что вы хотите сделать, с помощью обратного вызова before_create на вашем ModelClass? Смотрите здесь для получения дополнительной информации о обратных вызовах ActiveRecord (включая before_create).

...