3

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

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

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 自动过滤任何不良/未知属性的参数,我可以在任何模型的任何地方使用它,而必须重写这么多无用的代码。

谢谢

4

2 回答 2

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],参数哈希如下所示:

{ user: { email: "example@example.com", name: "Example" } }

因此,使用params[:user]可以让您获得属于用户的嵌套参数散列。

于 2012-12-24T03:48:49.897 回答
-1

You can filter a hash using select. Find a list of all attributes of your model and test if the keys are in that list:

attrs = a_user.attributes.keys - User.protected_attributes.to_a
a_user.update_attributes params.select {|k,v| attrs.include?(k)}
于 2012-12-24T03:55:57.660 回答