0

私のユーザー モデルには、シリアル化するように設定されたガイド付きフィールドがあります。デフォルトでは、フィールドは nil ですが、後で次のようになる予定です。

{
guided_step1 : true,
guided_step1_decision : 33,
guided_step2 : true,
guided_step3 : false,
guided_step4 : false
}

私の質問は、サーバー param[:user][:guided_step3] = true に投稿したい場合、他のすべてを削除してしまうということです。フィールドを投稿して更新したり、挿入したりするにはどうすればよいですか? このユースケースを処理する正しい方法は何ですか? ありがとう

4

2 に答える 2

1

なぜこれが機能しないのですか?

user = User.find id

user.datastpeps[:guided_step3] = true
user.save
于 2012-04-23T00:11:51.633 に答える
1

ここには 2 つの潜在的なアプローチがあります。最も簡単な方法は、ハッシュを に送信するだけでなく、コントローラーでハッシュをマージすることupdate_attributesです。

guided_steps = params[:user].delete(:guided_steps) || {}
@user.guided_steps = (@user.guided_steps || {}).merge(guided_steps)
@user.update_attributes(params[:user])

もう1つは、本当に自動にしたい場合はguided_stepsUserモデルでライターメソッドを再定義することです:

class User < ActiveRecord::Base
  ...
  def guided_steps=(new_steps)
    gs = self.guided_steps || {}
    gs = gs.merge(new_steps || {})
    write_attribute(:guided_steps, gs)
  end
  ...
end

これにより@user.update_attributes(params[:user])、コントローラーを呼び出すと、新しいコントローラーguided_stepsが古いコントローラーとマージされるようになります。このアプローチの潜在的な欠点の 1 つはguided_steps=、以前よりも直感的に機能しなくなることです。たとえば@user.guided_steps = {}、ハッシュはクリアされません。したがって、このアプローチの長所と短所のバランスを取るのはあなた次第です。

于 2012-04-23T01:46:55.813 に答える