Ruby on rails Rails在更新期间对原始记录运行验证

Ruby on rails Rails在更新期间对原始记录运行验证,ruby-on-rails,validation,activerecord,Ruby On Rails,Validation,Activerecord,我试图找出功能测试中发生的事情和开发环境中发生的事情之间的不一致性。我有一个自定义的验证方法unique\u条目,它本质上是的一个专门版本,用于验证的唯一性。看起来是这样的: def unique_entry matched_entry = Entry.first(:conditions => ['LOWER(field_one) = LOWER(?) AND LOWER(field_two) = LOWER(?)', self.field_one, self.field_two])

我试图找出功能测试中发生的事情和开发环境中发生的事情之间的不一致性。我有一个自定义的验证方法
unique\u条目
,它本质上是
的一个专门版本,用于验证
的唯一性。看起来是这样的:

def unique_entry
  matched_entry = Entry.first(:conditions => ['LOWER(field_one) = LOWER(?) AND LOWER(field_two) = LOWER(?)', self.field_one, self.field_two])
  errors.add_to_base('Duplicate detected') if matched_entry && (matched_entry.id != self.id)
end
SELECT * FROM "entries" WHERE (LOWER(field_one) = LOWER('original_value_of_field_one') AND LOWER(field_two) = LOWER('original_value_of_field_two')) LIMIT 1
控制器中的更新操作非常基本:

def update
  if @entry.update_attributes(params[:entry])
    flash.now[:success] = 'Success'
    render :action => 'show'
  else
    flash.now[:error] = 'Error'
    render :action => 'edit'
  end
end
当我创造一张新唱片时,这一切都很好。然而,当我更新记录时,我会得到不一致的行为。如果我在开发环境中从浏览器测试它,它会正确地呈现带有错误消息的
edit
操作,但在功能测试中,它会接受成功的更新。以下是测试:

test "should not update entry and should render edit view if invalid update" do
  put :update, { :id => 1, :field_one => 'new_value', :field_two => 'new_value' } # 'new values' are the same as another existing record to trigger the duplication check
  assert_template :edit
  assert_not_nil flash[:error]
end
我查看了测试日志,发现正在使用的值
unique\u entry
是记录的原始值,而不是它应该尝试更新的值。也就是说,
unique\u条目的第一行生成如下SQL查询:

def unique_entry
  matched_entry = Entry.first(:conditions => ['LOWER(field_one) = LOWER(?) AND LOWER(field_two) = LOWER(?)', self.field_one, self.field_two])
  errors.add_to_base('Duplicate detected') if matched_entry && (matched_entry.id != self.id)
end
SELECT * FROM "entries" WHERE (LOWER(field_one) = LOWER('original_value_of_field_one') AND LOWER(field_two) = LOWER('original_value_of_field_two')) LIMIT 1

我错过了什么?为什么我的验证似乎只针对测试环境中的原始记录而不是新值运行?

在您的测试中,不应该引用
:entry
,因为这就是您在控制器
参数[:entry]
中要查找的内容吗!我必须更改测试以使用这一行:
put:update,{:id=>1,:entry=>{:field\u one=>'new\u value',:field\u two=>'new\u value'}
。非常感谢。