Rails 3 - 在更新之前检查该对象是否对params有效

时间:2012-05-23 20:41:12

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

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

我希望改造:

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

6 个答案:

答案 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