実装機能
- 画面からの入力で、Userモデルに保存
- email, nameなど、Modelと同じプロパティのほか、profile_imageのアップロードを可能にする
- profile_imageに入力された画像をAmazon S3にアップロードし、実際のDBにはS3上のobject keyを文字列として保存
- profile_imageにはModel内でpresence: trueを指定
- carrierwaveなど、画像アップロードやS3のgemは利用しない
疑問点
email, nameなど、Modelと同じ形を持つプロパティはModelのバリデーション後、errors.add を利用すればviewまでエラー内容を渡すことが可能です。
しかし、profile_imageには、S3へのアップロードそのものの失敗/成功以前に、「jpegか」など、アップロードファイル自体のバリデーションを実施したいと思っています。
その場合、下記のような実装を検討していますが、
ruby
1class User 2 def create 3 @user = User.new(user_params) 4 #S3へ画像をアップロード 5 if key = S3connecter::upload_image_to_s3(file_params[:profile_image]) 6 @user.profile_image = key 7 else 8 flash.now[:profile_image] = 'ちゃんと画像をアップしてください' 9 render 'new' and return 10 end 11end
この場合、
- viewではerrorsとflashの両方を認識しなくてはならない(ファイル形式の誤りと、ファイルが空、は分けたいため)
- Controllerでマージ等する場合も、処理がひと手間増える
- そもそもbefore_saveなどでコールバックとしてアップロードも処理したいが、エラーハンドリングが複雑になってしまうと思われる
などの問題点があると思っています。
上記実装機能を抑えつつ、
- バリデーション
- エラーハンドリング/表示
- アップロード処理
を見通し良く書く方法にヒントがあれば、教えていただきたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。