Все еще испытываем трудности с подходом RoR MVC - PullRequest
3 голосов
/ 29 января 2011

Полагаю, было бы справедливо заявить о том, что я знаю, насколько я знаю, а также о том, что я сделал:

1) Я создал приложение и выполнил свою первую миграцию БД;Я знаю, что у меня есть база данных для разработки, тестирования и производства.В базе данных разработчика есть таблица с именем 'wines'.

2) Я создал эшафот, который создал необходимые файлы.

3) Установлены базовые методы index / update / destroy, и яМожно просматривать страницы.

4) Насколько я понимаю, класс ActiveRecord "Wine" автоматически наследует свойства из базы данных?Каждый столбец является свойством, а каждая строка в таблице 'wines' является потенциально экземпляром объекта, который вызывается из скрипта wine_controller.

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

Я нахожу себя в поиске функций, которые будут делать то, что я хочу (например, "favicon_link_tag", "stylesheet_link_tag" и "auto_discovery_link_tag" ...), но я не могу найти подходящее место, чтобы положить их!Я знаю, что это как-то связано с моим непониманием того, как вещи исполняются / наследуются.Например, если бы я объявил @pageTitle в application_controller.rb и использовал @pageTitle в ApplicationHelper, это не сработало бы.Или даже использование "stylesheet_link_tag" в application_controller.rb выдает ошибку.Я просто ничего не понимаю.

Как каждая вещь связана с другой с точки зрения хронологического исполнения, объема и т. Д .?

1 Ответ

5 голосов
/ 29 января 2011

В вашем каталоге "app / views" есть папка с названием "layout".По умолчанию там должен быть файл «application.html.erb», но если его нет, вы можете его создать.

Ваш файл макета «application» является файлом макета по умолчанию, используемым любым представлением.Однако, если вы хотите, чтобы определенный контроллер использовал другое представление, вы можете переопределить это.Посмотрите это railscast , и этот тоже полезен.

Главное, что нужно понять, это то, что содержимое любого конкретного представления будет отображаться везде, где метод yieldпоявляется в макете вашего приложения.Основной блок yield возвращает файл представления, указанный вашим действием контроллера, но вы можете пометить что-либо внутри любого представления, чтобы вместо этого передать его в другой блок yield.Например, приведенный вами пример «title» может быть передан в заголовок макета вашего приложения.См. Этот railscast для подробного примера этого.

Для получения дополнительной информации вам следует прочитать Руководство по Rails , и вы можете рассмотреть возможность приобретения стартовой книги по Rails.

Я промочил ноги от " Beginning Rails 3 ", который был феноменальным введением в каркас.Пара дней с этой книгой, и все это имело смысл для меня, и я развивался быстрее, чем когда-либо прежде.Рельсы качаются, как только ты узнаешь это, но это определенно стоит прочитать книгу.

Пожалуйста, продолжай задавать вопросы, я помогу, если смогу:)

-EDIT- ОтветитьВаш вопрос о потоке управления, он в основном работает так:

  1. Ваш браузер отправляет запрос GET для определенного URL.

  2. Маршрутизатор принимаетэтот запрос сопоставляет его с действием контроллера, запускает это действие контроллера и предоставляет контроллеру любые параметры, связанные с запросом.Например: если вы запросите example.com/posts/123?color=red, это вызовет действие SHOW вашего posts_controller и передаст {: color => 'red'} хэшу params.Вы можете получить доступ к этому, используя params[:color]

  3. Действие контроллера делает свое дело, и когда оно выполнено, оно выводит вывод.По умолчанию он отображает любое представление, расположенное в app/<controller_name>/<action_name>, и будет соответствовать тому файлу, который соответствует расширению, соответствующему запросу (т. Е. Запрос AJAX вызовет <action_name>.js.erb, а запрос GET вызовет <action_name>.html.erb.

    • Вы можете переопределить это, используя метод render, например, передав render 'foo/bar' для рендеринга, используя представление для FooController, действие Bar вместо вашего текущего действия.

    • Обратите внимание, что независимо от того, что вы визуализируете, данные, доступные для представления, будут зависеть от конкретного действия контроллера, запущенного маршрутизатором, а не от действия контроллера, которое "нормально" отобразит это представление.

  4. Файл представления анализируется с использованием данных из вызывающего его контроллера. Если у вас есть какие-либо методы content_for, тогда код представления, который находится внутри блока content_for, будет идти туда, куда вы его указываете.в противном случае все остальное будет идти к главному блоку YIELD в вашем макете application (или любом другом макете, указанном вашим контроллером).

  5. Макет приложения анализируется, и содержимое из представления вставляется в соответствующие области.

  6. Страница предоставляется пользователю.

В некотором смысле это упрощение, но я думаю, что оно отвечает на ваш вопрос.Опять же, не стесняйтесь спрашивать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...