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)
并使用它来更新您的单个属性.
| 归档时间: |
|
| 查看次数: |
11165 次 |
| 最近记录: |