ruby-on-rails – 验证和更新单个属性rails

我的用户模型中有以下内容
attr_accessible :avatar,:email

validates_presence_of :email
has_attached_file :avatar # paperclip

validates_attachment_size :avatar,:less_than => 1.megabyte,:message => 'Image cannot be larger than 1MB in size',:if => Proc.new { |imports| !imports.avatar_file_name.blank? }

在我的一个控制器中,我只想更新和验证头像字段而不更新和验证电子邮件.

我怎样才能做到这一点?

例如(这不起作用)

if @user.update_attributes(params[:user])
 # do something... 
end

我也尝试过update_attribute(‘avatar’,params [:user] [:avatar]),但这也会跳过avatar字段的验证.

解决方法

您可以使用 validate the attribute by hand并使用 update_attribute,即 skips validation.如果添加 this to your User
def self.valid_attribute?(attr,value)
  mock = self.new(attr => value)
  if mock.valid?
    true
  else
    !mock.errors.has_key?(attr)
  end
end

然后这样更新属性

if(!User.valid_attribute?('avatar',params[:user][:avatar])
    # Complain or whatever.
end
@user.update_attribute('avatar',params[:user][:avatar])

只有(手动)验证该属性时,才应更新单个属性.

如果你看一下Milan Novota的valid_attribute怎么样?工作,你会看到它执行验证,然后检查特定的attr是否有问题;是否有任何其他验证作为valid_attribute失败并不重要?仅查看您感兴趣的属性的验证失败.

如果您要做很​​多这样的事情,那么您可以向用户添加一个方法

def update_just_this_one(attr,value)
    raise "Bad #{attr}" if(!User.valid_attribute?(attr,value))
    self.update_attribute(attr,value)
end

并使用它来更新您的单个属性.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...