file_columnを使ってアップロードされたファイルを削除すると, marshal_dumpがどうとか言われる
Railsでファイルをアップロードする際によく使われているfile_columnプラグイン. 便利なんですが, とある条件でいやーなエラーが発生するみたいです.
その条件は"file_columnを使ったモデルをセッションに格納"し, その状態で"アップロードしたファイルを削除"すると, です. 発生するエラー(例外)は以下のとおり(TypeError).
no marshal_dump is defined for class Proc
どうやらセッションの内容をシリアライズする際, どこかにProcクラスのインスタンスが紛れ込んでいるらしい. そのせいで"Marshal.dumpでシリアライズできないよ"と言われています. 問題が発生している箇所がフレームワークなので, ブラウザで見ると500(サーバーエラー)となります.
原因はfile_columnプラグインのFileColumn::BaseUploadedFile#after_save.
# script/plugin installでインストールした状態で # /vendor/plugins/file_column/lib/file_column.rb 98行目辺り def after_save @on_save.each { |blk| blk.call } if @on_save self end
@on_saveがくせ者なので, 下記のようにして@on_saveを取り除いてやればOKでした.
def after_save if @on_save @on_save.each { |blk| blk.call } remove_instance_variable :@on_save end self end
にしても, file_columnプラグインがガンというコトに気づくのに時間喰った. あとあまりこの不具合を目にしないというコトは, セッションにモデルのインスタンスを格納するコト自体一般的でない?