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]と、params ハッシュは次のようになります。

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

したがって、使用params[:user]すると、ユーザーに属するパラメーターのネストされたハッシュが取得されます。

于 2012-12-24T03:48:49.897 に答える
-1

を使用してハッシュをフィルタリングできますselectモデルのすべての属性のリストを見つけて、キーがそのリストにあるかどうかをテストします。

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 に答える