我已经创建了用于创建新用户的设计RegistrationsController,并在调用超类的'create'方法之前添加了一些逻辑。所以,像:
class RegistrationsController<设计:: RegistrationsController
def create
超级终端
我可以通过检查resource.errors.nil来判断超类是否遇到错误。但是,我想区分不同的错误。例如,如果错误是“已经采用电子邮件”而不是其他错误返回,我想做一些不同的事情。
我可以解析字符串,但这对我来说似乎很脆弱。如果ActiveRecord或Devise的某些未来升级会更改字符串怎么办?如果字符串以某种方式本地化我不期望怎么办?
是否有人在设计中处理错误处理比字符串解析更优雅?
答案 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