- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

Ruby/Ruby on Rails/acts_as_list

はじめに Edit

このwikiのacts_as_listのインストールのページにあるRailsのデフォルトのプラグインでは、acts_as_listを組み込んだモデルのdestroy時に問題がでるようです。

問題を確認した環境 Edit

Edit

acts_as_listとattribute_fuプラグインを導入すると、
acts_as_listを組み込んだモデルのdestroyを呼び出すと、

can't modify frozen hash

というエラーでdestroyができずエラーが起きる。

rspecでテストを書いてみた時のエラー例:

1)
TypeError in 'Entry 保存したものが削除できること'
can't modify frozen hash
(project_dir)/vendor/plugins/attribute_fu/lib/attribute_fu/associations.rb:67:in `save_managed_associations'
(project_dir)/vendor/plugins/attribute_fu/lib/attribute_fu/associations.rb:64:in `each'
(project_dir)/vendor/plugins/attribute_fu/lib/attribute_fu/associations.rb:64:in `save_managed_associations'
(project_dir)/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb:126:in `remove_from_list'
(project_dir)/spec/models/entry_spec.rb:22:

このエラー時のスタックトレースとソースを見るに原因は

  1. モデルのdestroy時にacts_as_listのbefore_destroyのコールバックでremove_from_listが呼ばれる
  2. remove_from_listの下記箇所でデータが保存される
    update_attribute position_column, nil
    
  3. ここで、attribute_fuのafter_updateのコールバックにてAttributeFu::Associations#save_managed_associationsが呼ばれる
  4. AttributeFu::Associations#save_managed_associationsでattribut_fuで関連付けられた小モデルのsaveが実行される
  5. すでに小モデルがfrozen? = trueになっているので、"can't modify frozen hash"エラーが発生

うーん…

[TODO]:実際のコード上げたい

参考リンク Edit

この問題に関係ありそうなリンク


No comment. Comments/Ruby/Ruby on Rails/acts_as_list/destroy時のbefore_destroy callback挙動の問題?

Name:

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2010-06-02 Wed 21:29:52 JST (2725d)