Какова лучшая практика для отрисовки одной и той же вещи двумя разными способами? - PullRequest
0 голосов
/ 23 февраля 2011

Я получил - скажем, Actor - модель и соответствующий контроллер с классическим действием show, которое отображает полный список актеров и различную информацию о них (например, фильмы, в которых они снимались, и т. Д.).

Теперь я хотел бы получить ту же самую информацию, которая мне нужна для моего show действия, но показать их в частичном с другим стилем, так как этот частичный - скажем, _search_results - должен использоваться для создайте небольшое поле "поиск по типу".

Представьте действие show как окно Finder, отображающее папки и файлы, а мой фрагмент - как раскрывающийся список, который появляется при поиске чего-либо в Spotlight.

Конечно, я бы хотел оставаться максимально СУХИМЫМ, и поэтому мне интересно, как лучше всего это сделать, хотя я почти не повторяю код в моем actors_controller, поскольку информация, необходимая частичному, в точности соответствует то же самое, что действие show уже производит для представления show.

Спасибо.

Редактировать (N.B.) Конечно, я хочу, чтобы партиал отображался изнутри контроллера, потому что я не хочу, чтобы весь макет моего приложения отображался в окне результатов поиска!

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Классический совет по этому вопросу - вставить информационную сборку в модель, чтобы к ней можно было получить доступ несколькими действиями контроллера без дублирования.Именные области видимости и тому подобное делают многое из этого простым.

http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model

0 голосов
/ 23 февраля 2011

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

http://kpumuk.info/ruby-on-rails/simplifying-your-ruby-on-rails-code/

...