22

我有一个非常新手的问题。在更新模型之前,如何使用新参数检查模型对象是否有效?

我想改变它:

def update
  @obj = SomeModel.find( params[:id] )

  if @obj.update_attributes( params[:obj] )
    # That have been updated
  else
    # Ups, errors!
  end
end

对于这样的事情:

def update
  @obj = SomeModel.find( params[:id] )

  if @obj.valid_with_new_params( params[:obj] )
    @obj.update_attributes( params[:obj] )
  else
    # Ups, errors!
  end
end
4

6 回答 6

42

要更新属性而不保存它们,您可以使用

@obj.assign_attributes( params[:obj] )

然后检查对象是否有效,您可以调用

@obj.valid?

如果对象无效,您可以通过调用查看错误(仅在调用之后.valid?

@obj.errors

如果对象有效的,你可以通过调用保存它

@obj.save

但是,所有这些通常都不是必需的。如果对象无效,则 ActiveRecord 不会将对象保存到数据库中,因此当您离开控制器操作时,所有属性更改都会被遗忘。

此外,由于不会将无效记录保存到数据库中,因此您始终可以再次调用 Object.find() 以取回原始对象。

于 2012-05-23T20:48:16.067 回答
3

您可以调用该valid?方法来运行验证。

如果您的某些验证依赖于数据库中其他对象的状态,这并不能保证后续保存会成功。由于与验证无关的原因(例如外键约束),保存也可能失败

我不知道你为什么想要这个模式

于 2012-05-23T20:47:12.237 回答
0

如果传递的参数没有生成有效的对象,则不会保存该对象,因此您可以使用自己的方式就好了。@obj.errors您可以使用数组查看错误(如果有) 。

于 2012-05-23T20:45:21.903 回答
0

update_attributes方法验证对象,如果对象无效则返回 false。所以,你可以写:

if @obj.update_attributes( params[:obj] )
  # That have been update
else
  # Ups, errors!
end
于 2012-05-23T20:46:50.817 回答
0

答案是你可以定义一个方法

def valid_with_new_params(hash)
   self.attributes = hash
   valid?
end

但这将是不必要的,因为如果 obj 成功更新则@obj.update_attributes(params[:obj])返回,否则返回。另请注意,该方法在内部运行所有验证,以便 在更新失败时可用。truefalseupdate_attributes@obj@obj.errors

于 2012-05-23T20:49:14.413 回答
0

更新属性而不保存它们

@obj.attributes = params[:obj]   0r
@obj.attributes = {:name => “Rob”}

然后检查对象是否有效

@obj.valid?

检查是否有任何错误

@obj.errors
于 2012-09-19T08:30:33.187 回答