【问题标题】:Rescuing an ActiveRecord::RecordNotUnique in Rails 3.2在 Rails 3.2 中拯救 ActiveRecord::RecordNotUnique
【发布时间】:2013-05-21 14:09:23
【问题描述】:

我是 ruby​​ 新手,我想确保模型中三列的组合是唯一的。我尝试将 validates_uniqueness_of 与范围一起使用,但它没有按预期工作。所以我在我的数据库中添加了一个唯一索引,每次保存已经存在的值组合时都会引发 ActiveRecord::RecordNotUnique 异常。问题是我不确定如何处理异常。在我的控制器中,我将更新操作更改为:

def update

   @patient_history = PatientHistory.find(params[:id])
   @patient_history.save!

  respond_to do |format|
    format.html { redirect_to @patient_history, notice: 'Patient history was successfully updated.' }
    format.json { head :no_content }
  end

rescue ActiveRecord::RecordNotUnique

  respond_to do |format|
    format.html { render action: "edit" }
    format.json { render json: @patient_history.errors, status: :unprocessable_entity }

   end
 end
end

此代码不会保存更改并重定向到我的模型的显示页面 (:patient_history),并显示“患者历史记录已成功更新”的通知。我想要做的是让控制器重定向到编辑页面并在页面顶部闪烁一条关于错误的消息(很像 validates_uniqueness of 会做的)。

提前致谢

【问题讨论】:

    标签: ruby ruby-on-rails-3 error-handling rails-activerecord


    【解决方案1】:

    您是如何尝试使用 validates_uniqueness_of 的?您应该使用它来确保此组合是唯一的,如下所示:

    validates_uniqueness_of :column1, :scope => [:column2, :column3]
    

    【讨论】:

    • 是的,我就是这样做的,但它并不总是能正常工作。所以这就是我添加索引的原因。
    • @Marek Rails 验证方法不会阻止竞争条件,在 SQL 中创建“硬件”索引始终是一个好主意。只是因为它不经常发生,我通常更喜欢“让它失败”的范式,但这取决于你的客户。
    • 我想让它在发生错误时将用户重定向到表单页面,并且可能会打印出出错的通知。但是无论我在控制器中尝试过什么,它都不起作用。
    • 您做了哪些步骤,遇到了哪些错误(如果有)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多