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

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

アップロードする添付ファイルが1ファイルは前回の記事を参照。

実行例

複数のファイルをアップロードする。例では5ファイル。

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_many_attached  :attachments
end

:attachmentsの名称は任意。

3. ビュー

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

// 以下を追加する
<div class="field">
  <%= form.label "添付ファイル(複数ファイル可)" %>
  <%= form.file_field :attachments, multiple: true %>
</div>

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

// 以下を追加する
<p>
  <strong>添付ファイル:</strong>
  <% if @cat.attachments.attached? %>
    <% @cat.attachments.each do |obj| %>
      <% url = rails_blob_path(obj) %>
      <br>      
      <%= link_to URI.unescape(File.basename(url)),url %>
    <% end %>
  <% end %>
</p>

4. コントローラー

[cats_controller.rb]

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

  @cat = Cat.new(cat_params)
  @cat.attachments = params[:cat][:attachments]  
  
  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].attachments = params[:cat][:attachments]  
  @cat = @cat[0]
  
  if(!@cat.valid?) 
    render :edit
    return
  end 
        
  if @cat.save
    redirect_to @cat, notice: '更新しました。'
  else
    render :edit
  end  
end


def cat_params
  params.require(:cat).permit(:name, :description, attachments: [])
end

プロジェクトの実行

http://localhost:3000/cats

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

参考URL

Active Storage の概要





関連記事



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