4

マルチレベルのネストされた形式でデータを更新するのに問題があります。パーシャルを使用して、作成ビューと更新ビューの両方のすべてのフィールドを含めていますが、作成に問題はありません。更新する場合のみ。

基本的に構造(簡略化)は次のとおりです。

user has_one profile
profile has_many addresses

form_for @user do |u|
  u.fields_for :profile do |p|
    p.fields_for :addresses do |a|

私が言ったように、ユーザー、プロファイル、およびアドレスの作成は正常に機能します。更新しようとするまで、問題は見つかりません。エラーは表示されませんが、実際には正常に更新されたことが示されています。実際には、アドレスフィールドだけでなく、ユーザーフィールドとプロファイルフィールドも適切に更新されます。

スタックトレースからの更新のパラメータは次のとおりです。(繰り返しますが、要約およびフォーマットされています)

Parameters: {"controller"=>"profiles", "action"=>"update", "_method"=>"put", "id"=>"1", 
  "user"=>{"login" => "username",
    "profile_attributes"=>{"first_name"=>"Admin",
      "addresses_attributes"=>{
        "0"=>{"address"=>"123 Address Ave.", "city"=>"Cityville", "state"=>"CA"}
      }
    }
  }
}

私が見つけることができるすべてのドキュメントは1つのネストされたフォームしか示していないので、update_attributesを1レベル以上の深さで適切に使用しているかどうかはわかりません。

何かご意見は?

4

4 に答える 4

6

attr_accessible一括割り当てが許可されているフィールドをホワイトリストに登録するために、モデルのどこかで使用していますか? もしそうなら、あなたも追加する必要があります

attr_accessible :address_attributes

これらの属性を に渡すことができるようにしますupdate_attributes

まだ使用していないattr_accessible(または推奨されていない姉妹attr_protected) 場合は、この行を追加しないでください。すべての属性が保存されなくなります。

于 2011-02-01T11:15:39.263 に答える
4

同様の問題に遭遇しました。私の場合は、accept_nested_attributes_for クラス メソッドの「reject_if」句が原因でした。

accept_nested_attributes_for :player, :reject_if => proc { |attributes| 属性['フルネーム'].blank? }

プレーヤーの "full_name" 属性に空の文字列を残すことで、Rails はネストされたフォームに存在する属性を更新しようとさえしません。私の場合、 reject_if 句が必要ないことに気付いたので、それを削除して問題を修正しました。

于 2012-04-10T16:03:26.940 に答える
1

私はそれを助けることができると呼ばれる宝石を作成しました。標準の Rails フォーム、formtastic または simple-form で動作します。

gem は複数のネストされたレベルで動作します。かなり簡単に始められるように、github の readme を参照してください。さらにサポートが必要な場合はお知らせください。

于 2011-02-01T10:49:36.003 に答える
1

作成時ではなく、更新時にも同じ問題がありました。私のクラスモデルは Lecture has_many widgets です

class Lecture < ActiveRecord::Base
  attr_accessible :name , :order , :html, :widgets_attributes 
  has_many :widgets
  accepts_nested_attributes_for :widgets,  :allow_destroy => true
end

class Widget < ActiveRecord::Base
    belongs_to :lecture
    attr_accessible :width, :height, :xpos, :ypos, :source
end

Widget クラスの最後の行がすべての違いを生みました。

于 2012-05-30T06:44:35.917 に答える