2014-11-25 2 views
0

Это вопрос только о стиле кода.Должен ли я не допускать перевод I18n в моделях

Я работаю над многоязычным приложением в Ruby on Rails 4. Мое личное чувство говорит мне идеально, что я не звоню в I18n.t() в моделях, я просто думаю, что методы модели должны быть последовательными и не зависят от различных экологических ситуаций, таких как текущий пользовательский язык, тем более, что I18n обычно связан с представлениями. У меня есть несколько вопросов об этом:

  1. Как вы думаете, это хорошее правило в целом?
  2. Как я могу управлять сообщениями об ошибках в пользовательских методах проверки? Должны ли я делать исключения для этого сценария?
  3. Как я могу управлять настраиваемыми ключами, которые мы используем в полях формы, например, отображаемый текст collection_select, которые частично переведены? Есть ли способ использовать помощники вида для этих случаев, то есть (почти) так же удобно, как и методы модели здания для них?

ответ

3
  1. Да. Переводы относятся к слою представления и только к его «отображаемой» части (то есть не к API, который по-прежнему отображается)
  2. Ошибки сообщений должны быть достаточно стандартными, чтобы вы могли правильно их перевести, итерации их в вид и получение кусочных переводов. К сожалению, это не всегда возможно из-за разного грамматического порядка предложений на языках. Тем не менее нецелесообразно перемещать эти переводы в модель. Класс Errors ActiveRecord имеет перехваты для трансляций точно так же, как и ActiveModel, поэтому представление может полагаться на них, не вставляя никаких i18n в самой модели.
  3. Выбрать помощники часто могут использовать лямбда в качестве генератора меток, вы можете использовать и использовать пути просмотра и относительные ключи i18n и все, что вам нужно, не вводя ничего в модель. В случае сомнений используйте презентатор и введите I18n в него.
+0

Звучит многообещающе. Я попробую добавить лямбду к выбранным помощникам, чтобы увидеть, работает ли это. Что касается сообщений об ошибках: я бы не знал, как это сделать, в настоящее время я использую 'errors.add' для добавления сообщения. Как мне это сделать? Использовать ключ трансляции в качестве сообщения об ошибке и перевести это в представлении? (Это не будет работать вместе с собственными сообщениями Rails.) Не могли бы вы привести мне пример того, как я должен делать ошибки проверки или указать мне правильное направление? –

+0

Для ошибок, а также для имен атрибутов и т. Д., I18n уже поддерживает ActiveRecord с помощью 'ActiveModel :: Translate'. См. Http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models. Вам просто нужно определить фактические сообщения для каждой конкретной ошибки и вызвать «.full_messages» в представлении. – rewritten

+0

Для выбора, на самом деле вы можете предоставить вызываемые и для функций label и value в 'options_from_collection_for_select'. http://apidock.com/rails/v4.0.2/ActionView/Helpers/FormOptionsHelper/value_for_collection – rewritten

Смежные вопросы