问题描述
||
我有在论坛中注册的用户个人资料卡。
Person.update_all({:name => params[:person][:name],:sex => params[:person][:sex],:age => params[:person][:age],:avatar => params[:person][:avatar].original_filename,:city => params[:person][:city]},{:id => params[:id]})
这是用于更新数据库中数据的查询。但这是一个小问题-仅当用户通过表单头像(图像)发送时,这才适用。如果未发送头像,则表示用户已经上传了头像,并且该表格仅发送姓名,性别,年龄和城市。因此,在这种情况下,我会在行:avatar => params [:person] [:avatar] .original_filename中出错,-我想问您,如果存在某种优雅的方式,该如何处理这一刻。
我认为是这样的:
if params[:person][:avatar]
avatar = \':avatar => params[:person][:avatar].original_filename,\'
end
Person.update_all({:name => params[:person][:name],avatar
:city => params[:person][:city]},{:id => params[:id]})
但不幸的是,这行不通...您如何解决类似情况?
谢谢。
解决方法
好吧,好像您的params [:person]键与您的模型字段相似。那么,为什么不将
params[:person]
传递给update_all
呢?
另外,您可以创建一个哈希值person
,以所需的方式对其进行初始化,然后将其传递给update_all
person = { :name => params[:person][:name],...
if params[:person][:avatar]
person[:avatar] = params[:person][:avatar].original_filename
end
Person.update(params[:id],person)
我将update_all
更改为update
,因为update_all
用于更新所有符合条件的记录,而update
通过ID来查找记录。
但是,这又是一个不好的做法,您必须输入很多不必要的代码。
还有一件事。 update_all
进行直接DB调用,不涉及验证,回调等。
因此,如果您对此没有特殊原因,则最好执行以下操作:
@person = Person.find params[:id]
@person.update_attributes params[:person]
我真的认为,您应该检查一下这本书
再次更新:)
您会看到,这些东西属于您的模型,而不是控制器。您可以在模型中定义一个setter:
def avatar=(value)
write_attribute(:avatar,value.original_filename)
end