[RUBY] Certains styles d'écriture répétitive subtilement différents dans la vue Rails

Aperçu

Vous verrez un code comme celui ci-dessous. Ce n'est pas grave car il y a 4 cas, mais s'il y a 10 cas ou si le nid est profond, cela me rend triste. Je veux l'écrire facilement et avec peu de répétitions. J'essaye juste diverses choses.

<ul>
  <li>
    <div>Nom d'utilisateur</div>
    <div><%= user.name %></div>
  </li>
  <li>
    <div>adresse mail</div>
    <div><%= user.email %></div>
  </li>
  <li>
    <div>sexe</div>
    <div><%= user.sex == 1 ? 'Masculin' : 'Femme' %></div>
  </li>
  <li>
    <div>rôle</div>
    <div><%= user.role %></div>
  </li>
</ul>

1. Pour une simple répétition

Draper et [Translate Active Record Model](https://railsguides.jp/i18n.html#active-record%E3%83%A2%E3%83] % 87% E3% 83% AB% E3% 81% A7% E7% BF% BB% E8% A8% B3% E3% 82% 92% E8% A1% 8C% E3% 81% AA% E3% 81% 86 ) Permet de multiplier comme suit. Si tu peux juste le répéter, c'est bien

<!-- sex_Ajoutez la méthode de texte à UserDecorator.-->
<ul>
  <% %i[name email sex_text role].each do |key| %>
    <li>
      <div><%= User.human_attribute_name(key) %></div>
      <div><%= user.send(key) %></div>
    </li>
  <% end %>
</ul>

2. Pour une répétition partielle

Si quelque chose en dehors du modèle est mélangé au milieu, une simple boucle ne fonctionnera pas. La même description apparaît trois fois ou plus, mais elle peut être légèrement réduite en procédant comme suit

<ul>
  <% %i[name email].each do |key| %>
    <li>
      <div><%= User.human_attribute_name(key) %></div>
      <div><%= user.send(key) %></div>
    </li>
  <% end %>
  <!--J'ai une instruction à mettre en route pour la météo d'aujourd'hui-->
  <li>
    <div>La météo d'aujourd'hui</div>
    <div><%= Wheather.today %></div>
  </li>
  <% %i[sex_text role].each do |key| %>
    <li>
      <div><%= User.human_attribute_name(key) %></div>
      <div><%= user.send(key) %></div>
    </li>
  <% end %>
</ul>

3. Utiliser Helper

Je ne veux pas répéter la description du html trois fois, alors au moins en faire une méthode.

class UsersHelper
  def user_param_li(label, value)
    tag.li do
      tag.div(label) +
      tag.div(value)
    end
  end
end
<ul>
  <% %i[name email].each do |key| %>
    <%= user_param_li(User.human_attribute_name(key), user.send(key)) %>
  <% end %>
  <!--Mettez la météo d'aujourd'hui en route-->
  <%= user_param_li('La météo d'aujourd'hui', Wheather.today) %>
  <% %i[sex_text role].each do |key| %>
    <%= user_param_li(User.human_attribute_name(key), user.send(key)) %>
  <% end %>
</ul>

4. Préparez un cours

C'est difficile à lire et je suis triste car je ne peux pas voir la structure à plusieurs reprises. Préparez un objet.

#Cet objet est "Objet de service" "Présentateur" "Vue"_Il est appelé diversement comme "objet" et "PORO".
#Pour ce rôle, je l'appellerais un présentateur.
class UserParamsPresenter
  attr_reader :user
  def initialize(user)
    @user = user
  end

  def params
    [
      user_param(:name),
      user_param(:email),
      wheather_param,
      user_param(:sex_text),
      user_param(:role),
    ]
  end

  private 

  def wheather_param
    ['La météo d'aujourd'hui', Wheather.today]
  end

  def user_param(key)
    [User.human_attribute_name(key), user.send(key)]
  end
end
<ul>
  <!--Ce présentateur peut également être transmis depuis le contrôleur. Je ne sais pas lequel est le meilleur-->
  <% UserParamsPresenter.new(user).params.each do |label, value| %>
    <%= user_param_li(label, value) %>
  <% end %>
</ul>

5. J'en fais trop, alors j'y réfléchis et je l'écris d'une manière facile à comprendre, même si je regarde simplement View

Dans ce cas, cela n'aurait peut-être pas été si compliqué. Le concepteur est en difficulté. Est-il correct d'écrire du code ruby dans erb pendant un moment? Le présentateur peut être effacé.

<%
  user_params = [
    [User.human_attribute_name(:name), user.name)],
    [User.human_attribute_name(:email), user.email)],
    ['La météo d'aujourd'hui', Wheather.today],
    [User.human_attribute_name(:sex_text), user.sex_text)],
    [User.human_attribute_name(:role), user.role)],
  ]
%>
<ul>
  <% user_params.each do |label, value| %>
    <%= user_param_li(label, value) %>
  <% end %>
</ul>

6. Si c'est seulement ici, il semble plus facile d'appeler en premier lieu

J'ai fait quelque chose comme Helper, Draper et I18n, mais est-ce que je peux l'écrire assez bien sans? C'est un projet pressé.

<%
  user_params = [
    ['Nom d'utilisateur', user.name],
    ['adresse mail', user.email],
    ['La météo d'aujourd'hui', Wheather.today],
    ['sexe', user.sex == 1 ? 'Masculin' : 'Femme'],
    ['rôle', user.role],
  ]
%>
<ul>
  <% user_params.each do |label, value| %>
    <li>
      <div><%= label %></div>
      <div><%= value %></div>
    </li>
  <% end %>
</ul>

Résumé

Avec ce sentiment, de nombreuses façons d'écrire me viennent à l'esprit, et je dois faire le tour. Parmi ceux-ci, la seule façon de décider lequel est le meilleur est de regarder les conditions du marché. Si vous avez un style d'écriture que vous n'avez pas beaucoup écrit par vous-même, essayez de l'écrire en bougeant d'abord votre main. J'essaierai de l'écrire pour le moment, et il sera testé si le style d'écriture était approprié en modifiant les spécifications après quelques semaines et les commentaires de collègues.

Recommended Posts

Certains styles d'écriture répétitive subtilement différents dans la vue Rails
Afficher le calendrier mensuel dans Rails
Spécifier la vue d’origine dans l’application Rails [racine]
[Rails] Mise en œuvre de "notifier la notification d'une manière ou d'une autre"
[Localisation japonaise] Rails i18n Affichage de la vue de localisation japonaise simplifiée uniquement
Implémenter des itérations dans View en rendant une collection [Rails]