В рельсах 5, как у меня будет только одно сообщение проверки, если я оставлю поле пустым/пустым?

Я использую Rails 5. У меня есть это в моей модели...

  belongs_to :crypto_currency

  validates :crypto_currency, presence: true

Проблема в том, что когда я сохраняю свою модель из формы, возвращаются две ошибки, если я не устанавливаю значение для поля "Crypto_currency"...

Crypto currency must exist
Crypto currency Please select a value for crypto currency.

Это мой файл config/locales/en.yml. Мне все еще нужно решить, как удалить слова «Криптовалюта» из «Криптовалюта. Пожалуйста, выберите значение для криптовалюты». сообщение об ошибке, но вы можете ясно видеть, что я определил только одно сообщение об ошибке в файле

en:
  activerecord:
    errors:
      models:
        user_notification:
          attributes:
            crypto_currency:
              blank: "Please select a value for crypto currency."

Как получить только одно сообщение об ошибке для поля моей модели, если оно не введено?

Изменить: В ответ на комментарии, вот как я показываю сообщения об ошибках

  <ul>
  <% @user_notification.errors.full_messages.each do |message| %>
    <li><%= message %></li>
  <% end %>
  </ul>

person Dave    schedule 07.09.2017    source источник
comment
Если вы сделаете точку останова (byebug) и запустите user_notification..errors.full_messages, что вы увидите? А как насчет только user_notification.errors?   -  person Leonel Galán    schedule 07.09.2017
comment
Как вы показываете ошибки в своей форме? Обе ошибки в поле или одна в форме и одна в поле?   -  person Leonel Galán    schedule 07.09.2017
comment
Включил то, как я dplsya сообщения об ошибках в качестве редактирования вопроса.   -  person Dave    schedule 07.09.2017


Ответы (2)


Попробуйте изменить свою модель следующим образом:

belongs_to :crypto_currency, optional: true
validates :crypto_currency, presence: true

А также

en:  
  activerecord:
    attributes:
      user_notification:
        crypto_currency: ""
    errors:
      models:
        user_notification:
          attributes:
            crypto_currency:
              blank: "Please select a value for crypto currency."
person Thanh    schedule 08.09.2017

Rails 5 делает ассоциацию belongs_to обязательной по умолчанию

belongs_to :crypto_currency добавляет проверку, поэтому вам не нужна собственная.

Вы можете пропустить belongs_to проверку по умолчанию следующим образом:

belongs_to :crypto_currency, optional: true

Или удалите свое и настройте сообщение об ошибке по умолчанию.

person chumakoff    schedule 07.09.2017
comment
Это не работает. Я удалил свою собственную проверку, добавил требуемое: true, как вы предложили, но появляется сообщение об ошибке: Криптовалюта должна существовать, а не пользовательская, которую я хочу отобразить. - person Dave; 07.09.2017
comment
требуется: ложь - person chumakoff; 07.09.2017
comment
Если вы удалите собственную проверку, то в локалях она должна быть belongs_to :crypto_currency, required: true и required: "Please select a value for crypto currency.". Если вы хотите сохранить свою проверку, выполните required: false и не меняйте локали. - person chumakoff; 07.09.2017
comment
Правильно, я удалил свой собственный, поставил required: true и получил сообщение об единственной ошибке. Криптовалюта должна существовать (не то, что у меня было в локалях). Если я поставлю required: false и включу свою собственную проверку, я получаю единственную ошибку: Криптовалюта Пожалуйста, выберите значение для криптовалюты., все еще не совсем то, что у меня было в локалях (каким-то образом Криптовалюта становится предопределенной) - person Dave; 07.09.2017
comment
Во втором случае это ожидаемое поведение. Rails добавляет имя атрибута в начало сообщения об ошибке. Вы должны учитывать, что - person chumakoff; 07.09.2017
comment
Попробуйте использовать blank вместо «обязательного» в локалях (как сейчас в вашем вопросе) и используйте проверку по умолчанию, а не свою собственную - person chumakoff; 07.09.2017
comment
Хотя это поведение по умолчанию, это не то, чего я хочу. Но спасибо, что попробовали. - person Dave; 07.09.2017
comment
Проблема в вопросе была почему 2 сообщения?. Проблема с неправильным сообщением об ошибке не имеет к этому никакого отношения. Итак, вы должны отметить этот ответ как правильный. - person chumakoff; 07.09.2017
comment
Я считаю, что вместо required: false это optional: true - правильный способ отключить это. Для людей (таких как я), которые обновлялись с Rails и старше, не используйте инициализатор new_framework_defaults.rb с Rails.application.config.active_record.belongs_to_required_by_default = true - person Leonel Galán; 08.09.2017