niki12260714の日記

フリーランスのITエンジニアの呟き。

Ruby学習15日目:ファイルアップロード

すみません、終わってないです……

【やりたいこと】
・アイテム画像をアップロードする
・画像ファイルは拡張子が「.jpgか.gifか.png」であり、かつ1M以下であること
・画像ファイルはpublicフォルダの下にあるimgフォルダに配置する
・保存時にはユーザIDと時刻を組み合わせてユニークなファイル名にする
・DBに保存するのは新しく生成したファイル名

【できたこと】
・ファイルをpublic/img以下に配置し、その時にユニークな名前にして、その名前をDBに保存すること

【できてないこと】
・画像ファイルが正しくない時にエラー表示する

Scaffoldingで生成したコードの上に乗りたいので、画像ファイルのエラーはitem.errorsに登録したい。
そしてこれは、modelから生成するものと理解。
参考書のファイルアップロードのコードがcontrollerに書いてあるので、ファイルアップロードの処理をmodelに移そうとする。

→formからpostしたfile自体を上手くmodelで扱えない

仕方ないので、modelにerror.addするメソッドを定義。

def add_errors(msg)
errors.add(:file ,msg)
end

これをcontrollerから呼び出しているんですが、こういう使い方していいのか……?
とりあえず呼び出すのは呼び出せましたが、model呼び出すのがItem.new(param)でやっているので、
エラーなのにDB登録されてしまう。
newする前にファイルアップロードしているので、アップロードするときに問題があれば
newしないとすると、何故か

format.html { render :new }
↑このコードの引数の数がおかしいと言われる。
えええ……なんでだ……?
一日ずっと格闘していたんですが、上手くいかなくて詰まってます。
また明日見てみることにします。