BETA

【Rails】CarrierWave + S3 でユーザ画像の投稿 1

投稿日:2019-12-07
最終更新:2019-12-07

Railsで、CarrierWaveを使って画像の投稿をします。

ひとまず投稿までやってた忘備録です。
この記事はRailsの処理のみ記述しています。

Railsは記事が多いから開発が捗る!皆さんが言っていることが実感できました。

参考

基本的なとこ
https://qiita.com/junara/items/1899f23c091bcee3b058
エラー
https://codeday.me/jp/qa/20190301/345651.html
https://qiita.com/siruku6/items/a3a9021913749247d92b

Rialsの設定等は省略します。

Gem

Gemファイルに以下に2Gemを追加します。

gem 'carrierwave'  
gem 'fog-aws'  

carrierwave は画像を投稿する機能をサポートしています。
fog は外部との接続をしてくれてるものです。

$ bundle install  

で、Gemファイルのインストールを行いましょう!

モデルの設定

今回、私はUersテーブルに画像用のカラムを追加しました。
なので、その方法でやっていきます。(DBの構成は途中でいじらない方が良ですが。。)

$ rails generate migration AddImagesToUsers image:string   

で、マイグレーション用のファイルが出来上がります。

class AddImagesToUsers < ActiveRecord::Migration[5.2]  

  def change  
    add_column :users, :image, :string  
  end  

end  

Usersテーブルにstring 性質のimage カラムを追加しました。

$ bundle exec rake db:migrate  

でマイグレーションを実行します。

投稿用の設定ファイルの作成

app/uploaders/image_uploader.rb
config/initializers/carrierwave.rb

の2ファイルを作成します。

app/uploaders/image_uploader.rb

image_uploader.rbの作成

image_uploadファイルでは、ローカルで受け取ったファイルについての処理を行います。

$ rails generate uploader Image  

image_uploader.rb は作成されます。

class ImageUploader < CarrierWave::Uploader::Base  

  # Include RMagick or MiniMagick support:  
  # include CarrierWave::RMagick  
  # include CarrierWave::MiniMagick  

  # Choose what kind of storage to use for this uploader:  
  #storage :file  
   storage :fog  

  # Override the directory where uploaded files will be stored.  
  # This is a sensible default for uploaders that are meant to be mounted:  
  def store_dir  
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"  
  end  

  # Provide a default URL as a default if there hasn't been a file uploaded:  
  # def default_url(*args)  
  #   # For Rails 3.1+ asset pipeline compatibility:  
  #   # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))  
  #  
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')  
  # end  

  # Process files as they are uploaded:  
  # process scale: [200, 300]  
  #  
  # def scale(width, height)  
  #   # do something  
  # end  

  # Create different versions of your uploaded files:  
  # version :thumb do  
  #   process resize_to_fit: [50, 50]  
  # end  

  # Add a white list of extensions which are allowed to be uploaded.  
  # For images you might use something like this:  
   def extension_whitelist  
     %w(jpg jpeg gif png)  
   end  

  # Override the filename of the uploaded files:  
  # Avoid using model.id or version_name here, see uploader/store.rb for details.  
  # def filename  
  #   "something.jpg" if original_filename  
  # end  
end  

使いそうなところのコメントアウトは外しておきました。

storage :fog は今回のメインとなるところですね!

  def store_dir  
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"  
  end  

は画像のアップロード先のディレクトリです。

   def extension_whitelist  
     %w(jpg jpeg gif png)  
   end  

は、許可された画像の形式です。

carrierwave.rb

carrierwave.rb では、S3との接続の設定をします。こちらはファイル作成のコマンドは無いので各自作成してください。
config/initializers/carrierwave.rb

CarrierWave.configure do |config|  

  config.fog_credentials = {  
    provider: 'AWS',  
    aws_access_key_id: 'アクセスキー',  
    aws_secret_access_key: 'シークレットキー',  
    region: 'ap-northeast-1'  
 #東京の場合  
  }  

  config.fog_directory  = 'S3のバケット名'  
  config.asset_host = 'https://S3のバケット名.s3.amazonaws.com'   
  config.cache_storage = :fog  
  config.fog_provider = 'fog/aws'  

end  

モデルの設定

画像を投稿するテーブルのモデルに以下のコードを追加します。

mount_uploader :image, ImageUploader  

image はカラム名です。ImageUploader は上で設定したファイルを呼び出しています。

View

<%= image_tag @user.image.to_s %>  

のように、View側の設定もします。

以上でRails側の設定は終わりです。

まとめ

記事が多いって素晴らしい!!!

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

初学者の成長が垣間見れます

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう