Термин «лучшие практики» часто используется в каждой отрасли. Когда кто-то проходит ранние этапы своего образования во всем, что ему говорят, это «лучшая практика» делать определенные вещи одним способом, а не другим. Моя проблема в том, что то, что может хорошо работать для кого-то, может не работать для меня или вас. У каждого есть свои «лучшие практики», и я считаю, что каждый сам должен определить это для себя.

При этом, когда дело доходит до кодирования, я считаю, что одна из лучших практик — убедиться, что любой код, который вы пишете, должен быть максимально чистым и легко читаемым. Если мы посмотрим на программирование через призму разговора с компьютером (а это так и есть), было бы разумно сделать этот разговор легким и простым для отслеживания и понимания; похоже на то, как будет работать настоящий разговор. В Ruby on Rails есть инструмент, называемый партиалом, который помогает разделить код и легко повторно использовать его в любом приложении.

Частичные шаблоны или просто частичные шаблоны — это способ разбить процесс рендеринга на более управляемые фрагменты, а не хранить весь код в одном файле. Использование частичных кодов для разбиения кода облегчает редактирование и отладку, если вам это необходимо. Больше не нужно сканировать, казалось бы, бесконечную страницу кода в поисках ошибки. Чем меньше кода у вас в файле, тем легче его читать, поэтому редактирование и отладка становятся проще.

При запуске любого нового проекта Rails будет сгенерирован файл с именем views/layouts/application.html.erb, который может выглядеть примерно так:

<!DOCTYPE html>
<html>
  <head>
    <title>Title Goes Here</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>
  <body>
    <%= yield %>
  </body>
</html>

Добавление любого HTML-кода к этому будет сохраняться в приложении. Часто код панели навигации или нижнего колонтитула можно увидеть в этом файле.

В этом примере я хочу добавить панель навигации или навигационную панель, чтобы пользователи могли свободно перемещаться по приложению. Чтобы построить его, я использовал пример кода из Bootstrap для чего-то, что уже было разработано и стилизовано:

<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <div class="container-fluid">
    <a class="navbar-brand" href="#">Navbar</a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav me-auto mb-2 mb-lg-0">
        <li class="nav-item">
          <a class="nav-link active" aria-current="page" href="#">Home</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Link</a>
        </li>
        <li class="nav-item dropdown">
          <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
            Dropdown
          </a>
          <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
            <li><a class="dropdown-item" href="#">Action</a></li>
            <li><a class="dropdown-item" href="#">Another action</a></li>
            <li><hr class="dropdown-divider"></li>
            <li><a class="dropdown-item" href="#">Something else here</a></li>
          </ul>
        </li>
        <li class="nav-item">
          <a class="nav-link disabled" href="#" tabindex="-1" aria-disabled="true">Disabled</a>
        </li>
      </ul>
      <form class="d-flex">
        <input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
        <button class="btn btn-outline-success" type="submit">Search</button>
      </form>
    </div>
  </div>
</nav>

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

Здесь на помощь приходят частичные шаблоны. Все частичные шаблоны начинаются с символа подчеркивания «_», а затем имени файла, за которым следует «.html.erb». Поэтому в папке макетов просто создайте новый файл с именем:

_navbar.html.erb

Чтобы отобразить любой фрагмент, просто замените весь код навигационной панели одной строкой в ​​views/layouts/application.html.erb with :

<%= render 'layouts/navbar' %>

Эта одна строка означает, что файл application.html.erb должен отображать весь код панели навигации! Например, наши 30 или около того строк кода навигационной панели были перемещены в отдельный файл, и мы сократили его до одной строки!

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

Моя форма для создания новой статьи выглядит так:

<h1>Create a New Article</h1>
<% if @article.errors.any? %>
    <h2> The following errors prevented the article from being saved </h2>
    <ul>
        <% @article.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
        <% end %>
    </ul>
<% end %>
<%= form_with scope: :article, url: articles_path , local: true do |f| %>
    <p>
        <%= f.label :title %><br />
        <%= f.text_field :title %>
    </p>
    <p>
        <%= f.label :description %><br />
        <%= f.text_area :description %>
    </p>
    <p>
        <%= f.submit %>
    </p>
<% end %>

Форма для редактирования статьи выглядит так:

<h1> Edit Article </h1>
<% if @article.errors.any? %>
    <h2> The following errors prevented the article from being saved </h2>
    <ul>
        <% @article.errors.full_messages.each do |msg| %>
            <li><%= msg %></li>
        <% end %>
    </ul>
<% end %>
<%= form_with(model: @article, local: true) do |f| %>
    <p>
        <%= f.label :title %><br />
        <%= f.text_field :title %>
    </p>
    <p>
        <%= f.label :description %><br />
        <%= f.text_area :description %>
    </p>
    <p>
        <%= f.submit %>
    </p>
<% end %>

Эти формы практически идентичны. В кодировании почти нет смысла писать одно и то же дважды, поэтому для очистки можно использовать партиал.

Сначала создается частичный файл:

_form.html.erb

Далее весь код, кроме заголовков h1, перемещается в партиал.

Наконец, формы New и Edit получают соответствующий код для рендеринга партиала:

Обновленная форма «Новая статья» выглядит так:

<h1>Create a new article</h1>
<%= render 'form'%>

Обновленная форма редактирования статьи выглядит так:

<h1>Edit Article</h1>
<%= render 'form'%>

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

Partials — отличный инструмент в Rails, позволяющий сделать код более управляемым. Они упрощают отладку и могут превращать большие фрагменты кода в многократно используемые шаблоны, чтобы избежать чрезмерного кодирования. Код, который легко читать, редактировать и изменять, делает одного счастливого программиста.