批量更新属性

0xS*_*ina 3 ruby activerecord ruby-on-rails sinatra

我正在使用Sinatra,但我猜这也适用于Rails(如果没有,请删除标签或让我知道,我将删除它).

我有一个ActiveRecord :: Base类User.它有很多属性,我正在显示一个允许某人更新特定用户的页面.问题是,我很难以干燥的方式实现更新功能.我的意思是,当我收到paramsPOST请求时,我可以这样做:

a_user.update_attributes params
Run Code Online (Sandbox Code Playgroud)

因为params也含有其他垃圾(比如:splat- 那是什么?),它会抛出一个未知的属性错误.我需要做的是:

a_user.update_attributes {:attrA => params[:attrA], 
                          :attrB => params[:attrB], ...etc } 
Run Code Online (Sandbox Code Playgroud)

(请记住,有很多属性)

这是我应该怎么做的?对我来说,出于某种原因......感觉不对.例如,如果我有另一个需要以类似方式更新的模型,我必须再次手动重写所有属性.

我正在寻找的是一些像:

a_user.filter_and_update_attributes params
Run Code Online (Sandbox Code Playgroud)

其中filter_and_update_attributes自动过滤任何坏/未知属性的参数,我可以在任何模型的任何地方使用它,必须重写这么多无用的代码.

谢谢

Luk*_*uke 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>
Run Code Online (Sandbox Code Playgroud)

你应该能够使用这样的参数:

@user.update_attributes params[:user]
Run Code Online (Sandbox Code Playgroud)

当您将html字段命名为时user[email],params哈希看起来像:

{ user: { email: "example@example.com", name: "Example" } }
Run Code Online (Sandbox Code Playgroud)

因此,使用params[:user]获取属于用户的参数的嵌套哈希.