我有一个非常新手的问题。在更新之前,如何检查模型对象是否对新参数有效?
我希望改造:
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
答案 0 :(得分:38)
要更新属性而不保存它们,您可以使用
@obj.assign_attributes( params[:obj] )
然后检查对象是否有效,你可以调用
@obj.valid?
如果对象不有效,您可以通过调用
查看错误(仅在调用.valid?
后)
@obj.errors
如果对象 有效,您可以通过调用
保存它@obj.save
但是,所有通常都不是必需的。如果对象无效,则ActiveRecord不会将对象保存到数据库,因此在您离开控制器操作时会忘记所有属性更改。
此外,由于无效记录将不会保存到数据库,因此您可以再次调用Object.find()以获取原始对象。
答案 1 :(得分:3)
您可以调用valid?
方法来运行验证。
如果您的某些验证取决于数据库中其他对象的状态,则不保证后续保存会成功。由于未连接到验证的原因(例如外键约束)
,Te save也可能失败我不确定你为什么要这种模式
答案 2 :(得分:0)
如果传递的参数没有产生有效的对象,则不会保存该对象,因此您可以正常使用。您可以使用@obj.errors
数组查看错误(如果有)。
答案 3 :(得分:0)
update_attributes
方法验证对象,如果对象无效则返回false。所以,你可以写:
if @obj.update_attributes( params[:obj] )
# That have been update
else
# Ups, errors!
end
答案 4 :(得分:0)
答案是你可以定义一个方法
def valid_with_new_params(hash)
self.attributes = hash
valid?
end
但这是不必要的,因为@obj.update_attributes(params[:obj])
如果成功更新obj则返回true
,否则返回false
。另请注意,update_attributes
方法在内部运行@obj
上的所有验证,以便在更新失败时@obj.errors
可用。
答案 5 :(得分:0)
更新属性而不保存它们
@obj.attributes = params[:obj] 0r
@obj.attributes = {:name => “Rob”}
然后检查对象是否有效
@obj.valid?
检查是否有错误
@obj.errors