ホーム > カテゴリ > 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