Rails i18n проверяет, существует ли элемент перед отображением

У меня есть базовый цикл для отображения элементов из списка i18n:

  <% t('.items').each do |item| %>
    <p><%=item[:description]%></p>
    <p><%=item[:description_html]%></p>
  <%end%>

мой файл .yml организован следующим образом:

fr:
  pages:
    index:
      items:
      - title: The title
        description: The description 
        description_html: <p> The description with HTML tags</p>

Иногда элемент description_html не имеет никакого значения в моем файле .yml i18n, поэтому я хотел бы сначала проверить в своем коде, имеет ли значение description_html, прежде чем отображать его в моем HTML. Любое предложение?

Спасибо !


person florian    schedule 24.04.2018    source источник


Ответы (1)


Если вы просто хотите проверить, доступен ли перевод, вы можете использовать I18n.exists?

Например:

<% if I18n.exists?('pages.index.items.description_html') %>
  <%= I18n.t('pages.index.items.description_html') %>
<% end %>

Если вы просто хотите отобразить некоторый вывод по умолчанию, когда нет перевода, вы можете добавить значение по умолчанию в соответствии с этим ответом с помощью:

<%= I18n.t('pages.index.items.description_html', default: 'No description') %>
person Shadwell    schedule 24.04.2018
comment
это кажется наиболее подходящим ответом, но ваш пример, я думаю, неверен. 'I18n.существует?' возвращает true, когда учитываются резервные варианты. Что это значит? Допустим, что description_html действительно существует, поэтому в вашем примере условие if возвращает false, потому что значение существует, а условие не выполняется, поэтому ничего не происходит. Но если я добавлю условие ‹%else%› и напишу ' ‹%= I18n.t('pages.index.items.description_html') %›', все получится. Абсолютно не интуитивно, не так ли? Похоже, это странное поведение уже исправлено github.com/svenfuchs/i18n/issues/365 - person florian; 24.04.2018
comment
лучшее решение для этого, кажется, установить «config.i18n.fallbacks = false» в config/application.rb, но это боль. Извините, ваш пример был правильным, но нужно убедиться, что i18n.fallbacks правильно настроен - person florian; 24.04.2018
comment
Это зависит от того, как вы используете запасные варианты. Если у вас есть запасной вариант для всего, то вы в любом случае застрахованы, если в локали явно нет значения для ключа. - person Shadwell; 24.04.2018
comment
Теоретически я с вами согласен. Дело в том, что я объявил 'i18n.fallbacks=false', и даже когда 'description_html' существует и имеет значение, когда я пишу ‹% if I18n.exists?(item[:description_html]) %›‹%end%›, это возвращает false, поэтому вывода нет... Возвращает правильный вывод в блоке ‹%else%› - person florian; 24.04.2018
comment
Хорошо, только что нашел, как заставить его работать. Существует? функция ведет себя странно для меня, поэтому просто нужно проверить, является ли item[:description] истинным или ложным, следующим образом: ‹% if item[:description_html] %›‹p›exists‹/p›‹%else%›‹p› не существует‹/p›‹%end%› - person florian; 24.04.2018