Фильтрация ошибок проверки Rails на нескольких языках (I18n) - PullRequest
0 голосов
/ 12 марта 2019

Я хочу перехватить ошибки валидации, выданные Rails, в регистрационной форме.На английском языке это работает следующим образом:

if @user.save

  # Do whatever...

else

  @errors = @user.errors.full_messages

  if !@errors.index("Email has already been taken").nil?

    # Present the user with a 'forgot password' UI

  else

    # Display the error on the screen

  end

end

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

Однако это становится невероятно громоздким при использовании более чем одного языка, поскольку ошибки валидации уже локализованы, и мне пришлось бы использовать нечто чудовищное, как это:

if !@errors.index("Email has already been taken").nil? ||
   !@errors.index("Email n'est pas disponible").nil? ||
   !@errors.index("Email wurde bereits angenommen").nil? || ...

Я быМне нравится думать, что Rails может дать мне код состояния (как это делает HTTP), поэтому мне не нужно сравнивать строки, но я нигде не видел этого документированного.

Какой лучший обходной путь?

1 Ответ

1 голос
/ 12 марта 2019

Вы должны быть в состоянии получить более подробную информацию, опросив @user.errors.details руководстве по валидации кратко упоминается .

. По сути, вы должны увидеть что-то подобное при получении электронного письма:

> user.errors.details
=> { :email => [{:error => :taken, :value => 'exists@example.org'}] }

Это позволит вам проверитьдля "взятого" электронного письма:

if @errors.details[:email] &&  
  @errors.details[:email].any? { |error| error[:error] == :taken }
...