BackEnd

Shrineをモデルに関連付けないで使用してハマったこと

投稿日:2018年1月9日 更新日:

はじめに

ShrineはRailsでのアップロードを簡単に行えるようにするGemです。
詳しくはこちらを御覧ください。

Shrineで画像をアップロードする処理を実装するなら、多くの場合モデルに関連付けて使用すると思います。
しかし、今回は下記の理由によりモデルに関連付けずに使用しました(ファイル名自体はDBに保存しています)

  • モデルに関連付けて使用する場合テーブルにtext型のxxx_dataというカラムが必要になる。
  • (S3の署名付きURLなどで)画像の公開範囲を制限したいのでShrineが提供しているメソッドがそのままでは使えない。

実装の際、アップロード時のリサイズやバリデーションなどに少しハマったので対応方法を記載します。

アップロード時にリサイズする

まず、アップロードに関する処理ですが、他のアップロード処理にも使いまわせる用にモジュール化しています。

実装のアップロードは「upload_images」で行っており、引数はStrong Parametersです。

次に、モデルに関連付ける場合のアップローダのコード例は下記のとおりです。

上記のコードではアップロード時にリサイズ処理が実行されません。
モデルに関連付けない場合は下記の用になります。

アップロード時のバリデーション

バリデーションを行うためにモデルにアタッチする必要があったので、やむなくモデルに「image_data」というattributeを追加しました。

アップロード時に古いファイルを削除する

モデルに関連付ける場合、アップロードし直すと古い画像が削除されますが、関連付けない場合画像がどんどん増えていきます。
下記の方法でアップロード時に古いファイルを削除するようにしました。

さいごに

モデルに関連付けずにShrineでアップロードする際にハマったポイントと対応について紹介しました。

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

Go言語

Golangのsyncパッケージによる同期・排他制御

1 はじめに2 sync.WaitGroup3 sync.Mutex4 sync.RWMutex5 sync.Map6 sync.Once7 sync.Pool8 さいごに9 おすすめ書籍 はじめに ...

laravel logo

[Laravel]データベースの暗号化について考えてみる

1 はじめに2 環境3 Laravelでの暗号化4 暗号化されたカラムは、そのままではLIKE検索ができない4.1 問題点4.2 解決案1:全件取得してPHP側でがんばって検索する4.3 解決案2:暗 ...

Vue.js+TypeScriptな環境整備

1 はじめに2 vue-cliのインストール3 プロジェクトの作成3.1 機能の選択3.2 シンタックスの選択3.3 CSSプリプロセッサの設定3.4 Unit test3.5 E2E test3.6 ...

rails

deviseを使ってユーザ登録フォームを作る

1 はじめに1.1 前提条件2 deviseについて2.1 deviseとは2.2 deviseでできること3 登録処理の実装3.1 Gemのインストール3.2 deviseのインストール3.3 デフ ...

aws

ALB+EC2な環境でhttpをhttpsにリダイレクトする

1 はじめに1.1 前提条件2 ALBの設定3 Nginxの設定3.1 注意点4 さいごに はじめに httpsに対応済みのWebサイトの場合、httpでアクセスされた時にhttpsでリダイレクトする ...

フォロー

follow us in feedly

blog-page_side_responsive

2018年1月
 123456
78910111213
14151617181920
21222324252627
28293031 

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。