我的用户模型中有以下内容
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
并使用它来更新您的单个属性.