我正在使用Sinatra,但我猜这也适用于Rails(如果没有,请删除标签或告诉我,我会将其删除)。
我有一个ActiveRecord :: Base类User
。它有很多属性,我正在显示一个允许某人更新特定用户的页面。问题是,我很难以干燥的方式实现更新功能。我的意思是,当我通过POST请求获得params
时,我可以这样做:
a_user.update_attributes params
因为params也含有其他垃圾(比如:splat
- 那是什么?)并且它会抛出一个未知的属性错误。我需要做的是:
a_user.update_attributes {:attrA => params[:attrA],
:attrB => params[:attrB], ...etc }
(请记住,有很多属性)
这是我应该怎么做的?对我来说,出于某种原因......感觉不对。例如,如果我有另一个需要以类似方式更新的模型,我必须再次手动重写所有属性。
我正在寻找的是一些像:
a_user.filter_and_update_attributes params
其中filter_and_update_attributes自动过滤任何坏/未知属性的参数,我可以在任何模型的任何地方使用它,必须重写这么多无用的代码。
由于
答案 0 :(得分:6)
如果您按照以下方式构建表单:
<form action="/users" method="post">
<input id="user_email" name="user[email]" type="text">
<input id="user_name" name="user[name]" type="text">
<input id="user_phone_number" name="user[phone_number]" type="text">
...
<input id="user_email" name="user[email]" type="text">
<input name="commit" type="submit" value="Submit">
</form>
你应该能够使用这样的参数:
@user.update_attributes params[:user]
当您为html字段命名为user[email]
时,params哈希看起来像:
{ user: { email: "example@example.com", name: "Example" } }
因此,使用params[:user]
可以获得属于该用户的嵌套参数哈希值。
答案 1 :(得分:-1)
您可以使用select
过滤哈希值。查找模型的all attributes列表,并测试密钥是否在该列表中:
attrs = a_user.attributes.keys - User.protected_attributes.to_a
a_user.update_attributes params.select {|k,v| attrs.include?(k)}