Я пришел к этому вопросу в момент большого изменения дизайна в наших взглядах. Подумав немного о проблеме на боковой панели , я понял, что лучшего решения не существует (как всегда). Есть лучшие решения для каждого случая.
Я сравню 3 решений здесь:
- с использованием content_for (: боковая панель) и yield (: боковая панель)
- с использованием подхода частичных чисел
- используя драгоценный камень Cells
1. Использование content_for(:sidebar)
и yield(:sidebar)
Это хорошо для случаев, когда каждая ссылка (каждое действие контроллера), к которой вы обращаетесь, отображает отдельную боковую панель. В этом случае каждый доступ к вашему просмотру будет иметь часть content_for(:sidebar)
.
Если ваш вид боковой панели зависит, например, только от состояния некоторой переменной в сеансе, например, боковая панель не должна отображаться для каждой ссылки, к которой вы обращаетесь.
Затем вы должны использовать хорошую систему кеширования, такую как turbolinks , чтобы избежать многократного рендеринга одного и того же, или использовать что-то вроде Cells gem с javascript для рендеринга только основной части расположение.
2. Использование частичных
Использование партиалов всегда хорошо для устранения дублирования. Если ваша боковая панель очень проста и изменяется для каждого контроллера, вы можете отобразить ее как частичную. Но если вы отображаете разные части в одном контроллере, в зависимости от состояния, это может указывать на то, что в ваших представлениях есть бизнес-логика, чего следует избегать.
3. Использование драгоценного камня Cells
Очень хороший шаблон проектирования, когда вам приходится каждый раз визуализировать боковую панель с контроллера, отличного от остального вида.
Отнимает много бизнес-логики, что, безусловно, является хорошей практикой.
Здесь у вас есть действие , вызывающее представление . В этом представлении есть утверждение render_cell(:sidebar, params)
. Это утверждение будет выполнять некоторую бизнес-логику и отображать боковую панель. Это как если бы первое действие вызывало другие действия контроллера для визуализации определенных частей вашего представления (называемых ячейками)
Если вы вносите изменения только в боковую панель, возможно, вам придется создать другое простое действие, чтобы javascript запрашивал его. Это действие вызовет метод render_cell(:sidebar)
снова, чтобы ответить представлением.
Это очень интересный подход.
Другие идеи:
- Ваша боковая панель может отображаться только с использованием JavaScript из того же
действие.
- Ваша боковая панель может отображаться угловым контроллером, а рельсы посылают jsons с объектами боковой панели. (ищите "Одностраничные приложения")