ホーム > カテゴリ > Ruby・Ruby on Rails >

Active Storageを使用して添付ファイル(アップロード)を簡単に管理する

サーバーにアップロードされた添付ファイルは自前のテーブルでは管理せずに、RailsのActive Storageが削除などを自動的に管理します。

今回のデモプロジェクトでは、画像の表示からエクセル/PDFなどのファイルのダウンロードにも対応。

複数ファイル対応版は次回の記事を参照。

実行例

[エクセルファイル]

[画像ファイル]

1. 初期設定

// プロジェクトの生成
rails new . --skip-turbolinks --skip-action-mailer --skip-action-mailbox  --skip-test -d mysql

// データベースの設定
config/database.yml

// Active Storageのインストール
bin/rails active_storage:install

// scaffold(スキャフォールド)
bin/rails g scaffold Cat name:string description:text

// マイグレーションの実行(テーブルの生成)
bin/rails db:migrate

2. モデル

[app/models/cat.rb]

class Cat < ApplicationRecord
  has_one_attached :attachment
end

:attachmentの名称は任意。

3. ビュー

[app/views/cats/_form.html.erb]

// 以下を追加する
<div class="field">
  <%= form.label "添付ファイル" %>
  <%= form.file_field :attachment %>
</div>

[app/views/cats/show.html.erb]

// 以下を追加する
<p>
  <strong>画像:</strong>
  <% if @cat.attachment.attached? && @Attachment_image%>
    <%= image_tag @cat.attachment %>
  <% end %>
</p>

<p>
  <strong>ダウンロード:</strong>
  <% if @cat.attachment.attached? %>
    <%= link_to "添付ファイル(" +  @ext +")" ,rails_blob_path(@cat.attachment) %>
  <% end %>
</p>

4. コントローラー

[cats_controller.rb]

// 必要な箇所のみ記述
def create

  @cat = Cat.new(cat_params)
  @cat.attachment = params[:cat][:attachment]  
  
  if @cat.save
    redirect_to @cat, notice: '登録しました。'
  else
   render :new 
  end
end

def update

  @cat = Cat.where(id: params[:id])
  @cat[0].name = params[:cat][:name]  
  @cat[0].description = params[:cat][:description]     
  @cat[0].attachment = params[:cat][:attachment]  
  @cat = @cat[0]
  
  if(!@cat.valid?) 
    render :edit
    return
  end 
        
  if @cat.save
    redirect_to @cat, notice: '更新しました。'
  else
    render :edit
  end  
end



def show
  # ファイルの拡張子を判別する
  if @cat.attachment.attached?
    fullfilename = rails_blob_path(@cat.attachment)
    @ext = File.extname(fullfilename).downcase
  
    if @ext== ".jpg" ||  @ext== ".jpeg" ||  @ext== ".png" ||  @ext== ".gif" 
      @Attachment_image = true
    else
      @Attachment_image = false
    end    
  end   
end

// 以下のように「:attachment」を追加する
def cat_params
  params.require(:cat).permit(:name, :description, :attachment)
end

プロジェクトの実行

http://localhost:3000/cats

アップロードされたファイルの場所は「プロジェクト名/storage」です。

参考URL

Active Storage の概要





関連記事



公開日:2019年12月15日 最終更新日:2020年08月01日
記事NO:02811


この記事を書いた人

💻 ITスキル・経験
サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。

画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ
プチモンテ代表、アーティスト名:プチモンテ
🎵 音楽制作
BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は叙情詩、叙情的な楽曲が多い。楽曲制作は2023年12月中旬 ~

オリジナル曲を始めました✨

YouTubeで各楽曲を公開しています🌈
https://www.youtube.com/@petitmonte

【男性ボーカル】DA・KA・RA | 新たな明日が風と共に訪れる

【男性、女性ボーカル】時空を超越する先に | 時空と風の交響曲

【女性、男性ボーカル】絆 | 穏やかな心に奏でる旋律