Насколько я должен избегать вычислений в моих взглядах? - PullRequest
0 голосов
/ 11 января 2020

Я создаю приложение, в котором n пользователей могут общаться друг с другом (например, приложение для обмена сообщениями) в publi c. Поскольку вы могли бы хотеть иметь различную биографию для каждого разговора, который вы делаете (например, для обсуждения меня относительно Ruby в Rails потребуется другая биография, чем для психологии), у меня есть модель Spkr, в которой есть Пользователь и Tlk. Приведенный ниже код успешно означает, что на странице профиля пользователя для каждого экземпляра Spkr, Tlk и его участников виден каждый образ Spkr (поэтому, если Tlk имеет трех участников, тогда будут видны все три изображения) .

Настройка такова, что изображение по умолчанию - это изображение пользователя, но Spkr также может настроить свое изображение, загрузив его как Spkr. Я обеспокоен тем, что загружаю интерфейс слишком много вычислений. Прямо сейчас все работает ... так ли это нормально? Или я должен ограничивать вычисления, происходящие при построении представлений?

Спасибо

<% @user.spkrs.each do |spkr| %>
  <%= link_to show_tlk_path(spkr.tlk) do %>
    <h4><%= spkr.tlk.title %></h4>
    <% spkr.tlk.spkrs.each do |speaker| %>
      <div class="tlk-tlking-image spkr-image image-spkr-<%= spkr.id %>"
        <% if speaker.image.present? %>
          style="background-image: url(<%= rails_blob_url(speaker.image) %>)"
        <% elsif speaker.user.image.present? %>
          style="background-image: url(<%= rails_blob_url(speaker.user.image) %>)"
        <% end %>
        >
      </div>
      <p><%= speaker.name %></p>
    <% end %>
  <% end %>
<% end %>

Ответы [ 2 ]

3 голосов
/ 11 января 2020

Считается, что хорошей практикой является сохранение представления как можно более свободным от подсчетов. Эти файлы часто обрабатываются разработчиками внешних интерфейсов, которые могут даже не знать, как кодировать ruby, поэтому чем меньше их, тем лучше. Это также не совсем то, к чему оно относится в платформе Rail Control Model Viewler.

Прежде всего код, который вы поместили, можно упростить до:

<% @user.spkrs.each do |spkr| %>
  <%= link_to show_tlk_path(spkr.tlk) do %>
    <h4><%= spkr.tlk.title %></h4>
    <% spkr.tlk.spkrs.each do |speaker| %>
      <div class="tlk-tlking-image spkr-image image-spkr-<%= spkr.id %>"
        style="background-image: url(<%= rails_blob_url((speaker.image  || speaker.user.image) %>)"
        >
      </div>
      <p><%= speaker.name %></p>
    <% end %>
  <% end %>
<% end %>

Но, как вы говорите, если вы Если вы хотите обработать это в более подходящем месте, я бы добавил метод к классу Speaker:

# app/models/speaker.rb
class Speaker << ApplicationBase
  def image_for_view
    image || user.image
  end
end

Это позволит вам вызвать speaker.image_for_view, который, я думаю, хорошо читается в самом файле представления. .

1 голос
/ 11 января 2020

Наряду с отличным ответом позвольте мне добавить кое-что, что может помочь вам сделать взгляды более четкими. Может быть, не имеет отношения к вашему вопросу напрямую, но может помочь вам понять, как вы можете сделать вид красивым.

Первое, что заставит взгляды выглядеть хорошо, это помощники . Хотя рельсы предоставляют помощники для каждого контроллера, помощники являются глобальными, то есть их можно использовать где угодно в любых представлениях. Таким образом, глобальное форматирование должно быть сделано с помощниками. Например, если вам нужен форматер даты, который необходимо использовать во многих файлах просмотра, вы можете создать вспомогательный файл с именем date_helper.rb в app/helpers и указать желаемое форматирование даты -

module DateHelper
  def formatted_date(date)
    date.strftime([%m/%d/%Y')
  end
end

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

<p>
  Post title: <%= post.title.gsub("forbidden word", "") %>
  <%= link_to "Read post", post, class: "w-75 p-3 text-#{post.draft? ? "orange" : "green"} border-#{post.draft? ? "orange" : "green"}" %>
</p>

Чтобы сделать это более красивым, вы можете создать класс презентатора с именем post_presenter.rb, который должен находиться в app/presenters, и написать некоторый код, подобный -

class PostPresenter
  def initialize(post)
    @post = post
  end
  def title_without_forbidden_words
    @post.title.gsub("forbidden word", "")
  end
  def css_color
    @post.draft? ? "orange" : "green"
  end
end

и в представлении -

<% presenter = PostPresenter.new(post) %>
<p>
  Post title: <%= presenter.title_without_forbidden_words %>
  <%= link_to "Read post", post, class: "w-75 p-3 text-#{presenter.css_color} border-#{presenter.css_color}" %>
</p>

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

Примеры взяты с сайта rubyguides . Благодаря им

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