Шаблон дизайна для боковой панели с динамическим содержимым в Rails - PullRequest
4 голосов
/ 24 декабря 2011

Я хотел бы иметь правую боковую панель с изменениями содержимого для каждой страницы. Например, когда я на странице «Друзья», на боковой панели должно отображаться «Новые друзья». Когда я нахожусь на странице учетной записи, на боковой панели должно отображаться последние действия.

Как мне поступить так, чтобы уважать шаблоны проектирования Rails? Я слышал о драгоценном камне Cells, но не уверен, что использую его.

Ответы [ 3 ]

8 голосов
/ 25 декабря 2011

вот один из способов, добавьте в свой макет именованный раздел yield

<div id="main-content">
    <%= yield %>
</div>
<div id="side-content">
    <%= yield(:side_bar) %>
</div>

Затем, по вашему мнению, поместите контент в именованный выход, используя content_for

# friends view ....
<% content_for(:side_bar) do %>
    <%= render :partial => "shared/new_friends" %>
<% end %>

# account view ....
<% content_for(:side_bar) do %>
    <%= render :partial => "shared/recent_activity" %>
<% end %>    

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

см. Также - http://guides.rubyonrails.org/layouts_and_rendering.html#understanding-yield

5 голосов
/ 21 мая 2015

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

Я сравню 3 решений здесь:

  1. с использованием content_for (: боковая панель) и yield (: боковая панель)
  2. с использованием подхода частичных чисел
  3. используя драгоценный камень 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 с объектами боковой панели. (ищите "Одностраничные приложения")
2 голосов
/ 25 декабря 2011

попробуйте что-то вроде этого

<div class="sidebar">
    <% if current_page?(controller => "friends", :action => "show") %>
        <h4>New Friends</h4>
    <% elseif current_page?(controller => "accounts", :action => "show") %>
        <h4>Recent Activities</h4>
    <% end %>
</div>

Если приведенный выше код соответствует тому, что вы пытаетесь сделать (похоже, именно этого вы и хотите достичь), то придерживайтесь этого, иначе это может быть полезнопойти с некоторыми драгоценными камнями.Также ознакомьтесь со страницей helper о том, как использовать current_page?метод.Надеюсь, это поможет

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