Более СУХОЙ способ показать / скрыть партиалы / шаблон в рельсах
Обычно рекомендуемое решение content_for
в родительском файле макета. Но это приводит к необходимости указывать его в каждом представлении, поскольку по умолчанию оно не отображается, если содержимое отсутствует в частичном представлении дочернего элемента.
Например, если у меня есть боковая панель, которую я хочу скрыть на страницах аутентификации, но она есть везде, теперь я должен указать содержимое боковой панели в каждом файле представления, кроме страниц аутентификации. Не СУХОЙ.
Это гораздо более громоздко и не сухо, чем раньше, где я мог бы сделать частичную боковую панель в макетах и покончить с ней (но не смогу выбрать, где она отображается или нет).
Было бы хорошо, если бы вы могли как-то указать в шаблоне раскладок, который вызывает частичную боковую панель, чтобы не предлагать цену, если это контроллер сеанса или контроллер devise.
Есть какой-либо способ сделать это? Я пытался использовать
unless devise_controller?
render "layouts/sidebar"
Но это не похоже на работу.
Взяв пример с Devise, у меня есть файл application.html.slim примерно так
.row
main
.col-sm-9
= yield
- unless devise_controller?
.col-sm-3
== render 'layouts/sidebar'
Проигнорируйте столбцы на мгновение. Главное, что =yield
отображает обычные шаблоны, а также шаблоны для разработки. Поэтому я не могу выборочно отключить боковую панель за один СУХОЙ ход. Я должен был бы поместить вызов рендеринга боковой панели в каждый файл представления, но не включать его в мои представления разработки. Это не лучше и не СУХОЕ, чем использование content_for в каждом файле, не предназначенном для разработки.
И, возвращаясь к столбцам, я хотел бы, чтобы у полученных конструктивных представлений была полная ширина 12 столбцов, а не 9 столбцов. Но это только бонус, а не главный вопрос.
2 ответа
Я просто реализовал многословный способ делать вещи. Я буду использовать сложный пример, так как он может быть более полезным.
Здесь я настроил полные случаи, в зависимости от того, хочу ли я боковую панель или нет, в основном из-за того, как работают столбцы и строки начальной загрузки. Если вы используете загрузчик, вы заметите, что, как только вы запретите рендеринг боковой панели, у вас останется остальная часть основного содержимого, не занимая место, которое больше не занимает боковая панель. Это связано с тем, что ранее вам приходилось размещать боковую панель и основное содержимое в определенной ширине столбца, а также в строке (чтобы они отображались рядом). Поскольку вы хотите, чтобы основное содержимое заполнялось и занимало всю ширину, когда боковая панель исчезла, в этом случае вы должны применить совершенно разные значения ширины столбца. Отсюда полное утверждение if - else.
Таким образом, реализовать это так, не забудьте включить .rows
а также .col-*-*
в каждом из ваших основных подданных файлов просмотра.
application.html
- if hide_sidebar?
main
= yield
- else
.row
.col-xs-12.col-sm-9
main
= yield
.col-xs-12.col-sm-3
== render 'layouts/sidebar'
Если список страниц, которые вы хотите иметь или не иметь боковую панель, становится более сложным, чем просто все действия определенного контроллера, реализуйте отдельный вспомогательный метод, определяющий все условия.
Это один из способов сделать это в контроллере. В моем примере я хочу скрыть боковую панель, когда это контроллер регистраций и когда это действие show контроллера пользователя. я просто ||
каждый в вспомогательном методе.
application_helper.rb
def want_sidebar?
(controller_name == 'registrations') || ( (controller_name == 'users') && action_name == 'show' )
end
Если вы настаиваете на проверке имени контроллера, вы можете сделать это:
<% if controller.controller_name == 'devise' %>
...
<% else %>
<%= render 'sidebar' %>
<% end %>