处理设计注册错误

时间:2012-11-01 14:17:51

标签: ruby-on-rails devise

我已经创建了用于创建新用户的设计RegistrationsController,并在调用超类的'create'方法之前添加了一些逻辑。所以,像:

  

class RegistrationsController<设计:: RegistrationsController

     

def create

     

超级终端

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

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

是否有人在设计中处理错误处理比字符串解析更优雅?

3 个答案:

答案 0 :(得分:0)

您可以修改devise.en.yml以获取任何默认错误

答案 1 :(得分: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

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

答案 2 :(得分: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 Error对象的@details中准确描述了失败的验证。

Rails中甚至还有一个简短的方法,可以轻松测试特定的验证错误:

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

如果密码留空,则返回true。

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