LoginSignup
0
1

More than 1 year has passed since last update.

【Rails】Twitterクローンを作ってみた 〜画像アップロード(ActiveRecord)〜

Last updated at Posted at 2022-11-18

はじめに

【Rails】Twitterクローンを作ってみた 〜コメント機能の作成〜の続きです。こちらを前提に進めていきますので、まだご覧になっていない方はそちらからご覧ください!※こちらはdockerでの環境構築を省きます。

サービス環境

  • ruby 3.0.0
  • Rails 6.0.4
  • docker
  • mysql 8.0.2
  • Slim, SCSS

画像アップロード機能

条件

  • ユーザー詳細ページの自分のアイコンをクリックでプロフィール画像をアップロードできる。
    画像アップロードにはActiveRecordを使用してください。

実装流れ(簡略)

① Gemfileにgem "image_processing", ">= 1.2"を追記し、bundle install
② docker再起動
$ rails active_storage:install
④ db:migrate
⑤ models/profile.rbにhas_one_attached :image追記
⑥ profiles_controllers.rbを編集(必要なparamsにimageを加える)
⑦ profiles/_form.html.slim(プロフィール編集画面)を編集。cssも同様に。 ← accept条件!
⑧ profiles/show.html.slimを編集。cssも同様に。
⑨ tweets/index.html.slim(root_path), show.html.slimを編集。cssも同様に。
⑩ views/shared/_icon.htmlを作り、見た目の共通化

プロフィール編集画面

スクリーンショット 2022-11-18 15.40.16.png

プロフィール画面(画像アップロード後)

スクリーンショット 2022-11-18 15.46.04.png

解説

views/profiles/_form.html.slim

= form_with model: @profile, locals: true do |f|
  .form-group 
    = f.label :name
    = f.text_field :name, class: "form-control"
  .form-group 
    = f.label :profile_text
    = f.text_area :profile_text, class: "form-control"
  .form-group 
    = f.label :profile_image
    = f.file_field :image, class: "form-control", accept: 'image/jpg, image/jpeg, image/png, image/gif'
  .btn-space  
    = f.submit '保存', class: 'btn'

今回苦労した部分はこちらです。file_fieldに拡張子を制限して、画像ファイル以外選択できないようにするということです。最初はモデルでのバリデーションで処理しようかと考えていたのですが、簡単にhtml側で処理することができるというとてもシンプルなものを知り、こちらを使用しました。(acceptを使用することで、拡張子が画像系のものしか上げなくできます。)

モデルに一つのファイルを添付する

class Profile < ApplicationRecord
  belongs_to :user
  has_one_attached :image

  validates :name, presence: true
  validates :profile_text, presence: true
end

Profileモデルに1つの画像を添付するには、has_one_attachedを使います。
:imageはファイルの呼び名で、:photo、:avatar、:hogeなど、ファイルの用途に合わせて好きなものを指定してください。ここで、Imageモデルなどを作る必要はないです。Active Storageは裏側でBlobとAttachmentモデルを使って、こそこそとprofile.imageを使えるようにしてくれます。

実装を通して学んだこと

1. Active Storageの利用方法

ファイルアップロードを行うための機能で、画像の投稿機能などが簡単に作れることを学びました。画像用ののカラムを作成することもなく、Imageモデル等も作る必要がないことを学びました。

2. acceptでの拡張子制限

html属性でfile_fieldに拡張子を制限できる方法があることを知りました。

感想

今回は簡単に機能を作成することができました!この機会でacceptでの拡張子制限等、知らないとすんなり行かないところを学べました。railsには様々な便利なgemがありますね。知らないgemの機能は無限にあると思いますが、その都度調べて使えるように自走力をつけることは非常に大事だなと感じております。
次回はomniauthを使ったGitHubログインについてアウトプットしていこうと思います!読んでいただきありがとうございました。

参考記事

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1