Rails - много моделей в одном представлении - PullRequest
5 голосов
/ 23 ноября 2011

Мне нужно получить доступ к нескольким моделям из одного представления. Ранее my links_controller использовался только для предоставления ресурсов ссылок, отсортированных по-разному. Теперь я хотел бы включить частичный (я предполагаю), который показывает лучших пользователей, отсортированных по баллам (@users = User.all.sort_by(&:score))

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

Примечания:

  • Я вижу, что мое приложение движется в направлении единого формата с динамическим содержимым страницы, по сути, типичного веб-приложения.
  • Мне известно о before_filter, но это кажется обременительным, учитывая направление, в котором я хотел бы, чтобы приложение работало. В конечном итоге доступ к нескольким моделям из любого представления.

Ответы [ 2 ]

5 голосов
/ 23 ноября 2011

Такого рода вещи лучше всего инкапсулировать как вспомогательный метод, который применяется этим конкретным частичным.Например, если это был ваш частичный _user_listing.html.erb:

<% users_by_score.each do |user| %>
   ...
<% end %>

Тогда вы бы реализовали метод users_by_score в вспомогательном файле, включенном во все соответствующие контроллеры, или ApplicationHelper, если он преобладает:

def users_by_score
  User.all.sort_by(&:score)
end

В других системах MVC это будет считаться вложенным представлением с собственным контроллером, но в Rails лучшее, что вы можете сделать, - это использовать вспомогательные методы.

3 голосов
/ 23 ноября 2011

Есть несколько вариантов, чтобы справиться с этим.

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

Итак, в этом свете есть несколько вариантов.

Подход Classic Rails

У нас естьбольшое приложение, в котором есть несколько общих блоков, связанных не с текущей страницей, а с текущим пользователем, где он может видеть свои предметы, действия и быстро прыгать.Все это происходит из базы данных.

Мы извлекаем данные, используя before_filter методы.Эти методы определены в ApplicationController.Мы уменьшаем наш ApplicationController, смешивая этот код (общее поведение).

В нашем макете application мы визуализируем различные партиалы для данных, собранных в этих фильтрах.Большинство из этих блоков зафиксированы и всегда видны.

Ячейки

Я не использовал его сам, но очень чистое решение, это использовать ячейки .Ячейки на самом деле являются своего рода блоками с собственным контроллером и представлениями, которые вы можете разместить на своей странице.Это звучит очень интересно и определенно интересно, если у вас есть портальный сайт с портлетами (кто-нибудь знает, что я имею в виду? Я чувствую себя таким старым;)).

Переключиться на клиент MVC

Если вы переключаетесь на одностраничное веб-приложение, такое как Gmail, то это также подходящее время для перехода на использование JavaScript-инфраструктуры MVC.Затем ваша страница может быть составлена ​​из разных областей, каждая со своей моделью и видом (шаблоном), которые ссылаются на ваш контроллер rails.

В настоящий момент существует тонна библиотек, кажется, что все используют Магистраль в наши дни, но если вы выберете этот маршрут, я бы порекомендовал проверить spine.js : он имеет потрясающую интеграцию с рельсами и очень прост в использовании.

Надеюсь, это поможет.

...