验证和更新单个属性rails

Mad*_*han 8 activerecord ruby-on-rails rails-activerecord

我的用户模型中有以下内容

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? }
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

例如(这不起作用)

if @user.update_attributes(params[:user])
 # do something... 
end
Run Code Online (Sandbox Code Playgroud)

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

mu *_*ort 13

您可以手动验证属性并使用update_attribute,跳过验证.如果你把User添加到你的:

def self.valid_attribute?(attr, value)
  mock = self.new(attr => value)
  if mock.valid?
    true
  else
    !mock.errors.has_key?(attr)
  end
end
Run Code Online (Sandbox Code Playgroud)

然后这样更新属性:

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

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

如果你看一下Milan Novota的valid_attribute?工作方式,你会看到它执行验证,然后检查具体attr是否有问题; 如果任何其他验证失败,则无关紧要,因为valid_attribute?只查看您感兴趣的属性的验证失败.

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

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

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


Kle*_* S. 8

一个条件?

validates_presence_of :email, :if => :email_changed?
Run Code Online (Sandbox Code Playgroud)