ここには 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_steps、Userモデルでライターメソッドを再定義することです:
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 = {}、ハッシュはクリアされません。したがって、このアプローチの長所と短所のバランスを取るのはあなた次第です。