【问题标题】:Rails 3: Handle ActiveRecord::RecordNotUnique ExceptionRails 3:处理 ActiveRecord::RecordNotUnique 异常
【发布时间】:2011-01-05 21:44:29
【问题描述】:

如何处理控制器中的ActiveRecord::RecordNotUnique 异常?谢谢

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

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

编辑2

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

【问题讨论】:

  • 可能还有更多代码?我认为您在尝试保存记录时遇到了该异常,并且该部分未包含在您的示例中。
  • 是的,没错。谢谢。

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:
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

【讨论】:

  • 我已经用新代码编辑了这个问题。我试过没有@couponcode on the rescue 和 with。错误依旧,还有异常没有处理。
  • 您确定错误来自.new 行而不是.save 的调用位置吗? ActiveRecord::RecordNotUnique 的文档建议在将记录保存到数据库时提出它。无论如何,从长远来看,尝试在救援区做几乎相同的事情会导致痛苦。如果您期待错误,从用户的角度来看,您需要更优雅地处理它(例如使用验证和表单错误)。
  • 如果您没有预料到错误,但它经常发生,您应该尝试找到问题的根源,而不仅仅是压制它。对不起,双重评论,所以评论长度限制! :)
  • 它有效。谢谢。我完全理解你的意思。但我不知道我还能做什么。我正在生成唯一代码,并且算法尽可能唯一,但我想确保代码不相等,所以我有一个 unique_index。如果保存时代码不是唯一的,我没有其他选择来生成另一个代码并保存它。我知道如果代码在第二次生成时不是唯一的,我会遇到问题,但我该怎么办?
【解决方案2】:

使用此验证方法 validate_uniqueness_of 并不能保证不会插入重复记录。

你应该看看here

【讨论】:

    【解决方案3】:

    您可以添加唯一性验证,并且仍然有机会更改代码而无需使用救援。

    优惠券代码.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,它会是唯一的,无需检查。

    【讨论】:

      猜你喜欢
      • 2015-02-06
      • 1970-01-01
      • 2019-09-20
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多