@nqounetです。

Mojoliciousのファイルアップロードではまった。

また自分がやらかしそうなので記録。

3時間くらいウンウン唸っていたけど、ちゃんと冷静に考えたら、データベースにリファレンスそのものを書き込もうとしていただけだった。

Mojoliciousを使ってファイルのアップロード機能を作成していた時、

1
No references other than a SCALAR reference can use a update column

というエラーメッセージが出るようになってしまった。

schemaから情報を読み込んでフォームを作成したり、そのフォームの情報を確認して、問題なければ書き込む、という一連の処理を作成していた。

Mojoliciousでは、ファイルのアップロードをした時に、paramから値を取得するとオブジェクト(Mojo::Upload)が取れるようになっている。 最初に作成したときは、

1
2
3
4
5
6
7
my $upload = $self->param('upload');
if (ref $upload eq 'Mojo::Upload') {
if ($upload->filename) {
$upload->move_to(file('path', 'to', $upload->filename));
}
$upload = $upload->filename;
}

という感じで作っていたのだけど、例外処理をいくつか作っているうちに、$uploadを操作しないままオブジェクトを書き込むことになっていた。

まあ、変数を兼用したのがそもそも良くないような気がするので、ファイルのアップロードをしたい時は、変数を別に作るというか、フォームを作成するときに名前を変更して作っておくほうが良いかもしれない。