我有一张在我论坛注册的用户个人资料卡。
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],
:sex => params[:person][:sex],
:age => params[:person][:age],
avatar
:city => params[:person][:city]},
{:id => params[:id]})
但不幸的是,这不起作用......你是如何解决类似情况的? 谢谢。
答案 0 :(得分:1)
好吧,好像,你的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
进行直接数据库调用,不涉及验证,回调等。
所以,如果你没有特别的理由,你最好这样做:
@person = Person.find params[:id]
@person.update_attributes params[:person]
我真的认为,你应该检查this book
再次更新:)
你知道,这些东西属于你的模型,而不是控制器。您可以在模型中定义一个setter:
def avatar=(value)
write_attribute(:avatar, value.original_filename)
end