2011-01-05 65 views
12

如何在控制器中处理ActiveRecord::RecordNotUnique异常?谢谢Rails 3:处理ActiveRecord :: RecordNotUnique异常

编辑:我在生成一个唯一的代码时得到这个异常。我可以在application_controller.rb中处理异常,但我真正想要的是编写代码以再次生成,并且必须在控制器中完成。

generate_code 
@couponcode = Couponcode.new(:user_id => current_user.id, :code => @code) 

EDIT2

generate_code 

begin 
    @couponcode = Couponcode.new(:user_id => current_user.id, :code => @code) 
rescue ActiveRecord::RecordNotUnique 
    #generate_code 
    @code = "111-11111" 
    @couponcode = Couponcode.new(:user_id => current_user.id, :code => @code)   
end 
+0

也许有点多的代码?我想你在试图保存记录时遇到了这个异常,并且该部分未包含在您的示例中。 – Heikki 2011-01-05 22:24:20

+0

是的,这是正确的。谢谢。 – donald 2011-01-05 22:46:01

回答

21
begin 
    # do stuff 
rescue ActiveRecord::RecordNotUnique 
    # handle the exception however you want to 
end 

http://ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html

你也可以使用rescue_from如果您需要处理往往一些东西。

+0

我用新代码编辑了问题。我已经试过没有@couponcode的救援和。错误仍然是一样的,仍然有异常没有被处理。 – donald 2011-01-05 22:06:31

+0

你确定错误来自'.new'行,而不是'.save'被调用的地方吗? [ActiveRecord :: RecordNotUnique](http://api.rubyonrails.org/classes/ActiveRecord/RecordNotUnique.html)的文档建议将记录保存到数据库时将引发它。无论如何,试图在救援中做同样的事情将会导致长期的痛苦。如果您预期错误,从用户的角度来看,您需要更优雅地处理它(例如使用验证和表单错误)。 – idlefingers 2011-01-05 22:22:11

+0

如果你没有预料到这个错误,但它发生了很多,你应该试着找到问题的根源,而不是压制它。对于双重评论,SO评论长度限制! :) – idlefingers 2011-01-05 22:23:26

1

您可以添加唯一性验证,并且仍然有机会更改代码而不必使用rescue。

couponcode.rb

validates_uniqueness_of :code 

控制器:

@couponcode = Couponcode.new(:user_id => current_user.id) 
begin 
    couponcode.code = generate_code 
    # might want to break out after a limit here 
end until @couponcode.valid? 
@couponcode.save 

但你也可以使用一个UUID,这将是唯一没有检查。

4

使用此验证方法validate_uniqueness_of不保证没有重复的记录插入。

您应该看看here