1

我将设计 RegistrationsController 子类化用于创建新用户,并在调用超类的“创建”方法之前添加了一些逻辑。所以,像:

类 RegistrationsController < 设计::RegistrationsController

定义创建

超级端

我可以通过检查 resource.errors.nil? 来判断超类是否遇到错误?但是,我想区分不同的错误。例如,如果错误是“电子邮件已被接收”而不是其他一些错误返回,我想做一些不同的事情。

我可以解析字符串,但这对我来说似乎很脆弱。如果 ActiveRecord 或 Devise 的某些未来升级更改了字符串怎么办?如果字符串 get 以某种我不期望的方式本地化了怎么办?

有没有人比字符串解析更优雅地处理设计中的错误处理?

4

3 回答 3

0

请注意,devise_error_messages帮助程序只是运行附加到您指定为resource对象的任何错误(无论您在哪个用户模型上运行安装生成器)。

现在,您不仅可以在帮助程序中打印出错误消息,还可以在控制器方法中访问它们的键:

 # in RegistrationsController
 def create
   build_resource
   unless resource.valid?
     if resource.errors.has_key?(:my_error_key)
       # do something
     end
   end
 end

当然,这只是一个示例,但希望它能说明您可能采取的方法。

于 2012-11-01T14:44:47.853 回答
0

您可以针对任何默认错误修改 devise.en.yml

于 2012-11-01T14:24:33.557 回答
0

对于 Rails 验证错误,魔鬼在@details 中。

存在的典型验证错误如下所示:

> @user.errors
#<ActiveModel::Errors:0x007fe7e8f01234 @base=#<User id: nil, 
email: "someone@else.mail", created_at: nil, updated_at: nil>,
@messages={:password=>["can't be blank"], :email=>[]},
@details={:password=>[{:error=>:blank}]}>

如您所见,失败的验证在 ActiveModel 错误对象的@details 中准确描述。

在 Rails 中甚至有一个速记方法可以很容易地测试特定的验证错误:

@user.errors.added? :password, :blank

如果密码留空,这将返回 true。

更多关于添加?在 Ruby on Rails API 中: http: //api.rubyonrails.org/classes/ActiveModel/Errors.html#method-i-added-3F

于 2016-11-14T14:14:26.167 回答