过滤 Rails 多种语言的验证错误 (I18n)
Filtering Rails validation errors with multiple languages (I18n)
我想拦截 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 那样)所以我不需要比较字符串,但我没有在任何地方看到它的记录。
最好的解决方法是什么?
你问问@user.errors.details
应该能知道更多的细节。它在 guide to validations.
中得到了简短的提及
基本上,当电子邮件被接收时,您应该会看到类似这样的内容:
> user.errors.details
=> { :email => [{:error => :taken, :value => 'exists@example.org'}] }
这将使您检查 "taken" 电子邮件成为:
if @errors.details[:email] &&
@errors.details[:email].any? { |error| error[:error] == :taken }
我想拦截 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 那样)所以我不需要比较字符串,但我没有在任何地方看到它的记录。
最好的解决方法是什么?
你问问@user.errors.details
应该能知道更多的细节。它在 guide to validations.
基本上,当电子邮件被接收时,您应该会看到类似这样的内容:
> user.errors.details
=> { :email => [{:error => :taken, :value => 'exists@example.org'}] }
这将使您检查 "taken" 电子邮件成为:
if @errors.details[:email] &&
@errors.details[:email].any? { |error| error[:error] == :taken }