画像投稿機能(ActiveStorageの導入)

内容

画像投稿も実装するため、再度新規投稿機能の見直しから

新規投稿機能の見直し

1. Googleマップを埋め込む

新規投稿の上部にGoogleマップの埋め込み機能を使用して、マップを表示
GoogleMapsAPIの導入も考えているが、余裕があれば追加実装で行う

新規投稿機能で画像アップロード機能を追加(まずは1枚のみ)

1. Active Storageの導入

まずはImageMagickをHomebrewからインストール
ターミナル

% brew install imagemagick

続いてGemをインストールし、ローカルサーバーを再起動 Gemfile

# Gemfileの一番下に記述する

gem 'mini_magick'
gem 'image_processing', '~> 1.2'

ターミナル

% bundle install
% rails s

続いてActive Storageをインストール
ターミナル

% rails active_storage:install
% rails db:migrate

Sequel Proを確認し、DBが存在すればOK

2. postsテーブルに画像ファイルを紐付ける

postsテーブルとActive Storageのテーブルで管理された画像ファイルのアソシエーションを記述
app/models/post.rb

class Post < ApplicationRecord
  has_one_attached :image
end

この時、postsテーブルにカラムを追加する必要はない

3. 画像の保存を許可するストロングパラメーターにする

imageという名前でアクセスできるようになった画像ファイルの保存を許可する実装を行う
app/controllers/posts_controller.rb

private

def post_params
  params.require(:post).permit(~, :image).merge(user_id: current_user.id)
end

4. 画像アップロード機能を表示

ビュー、CSSを編集
app/views/posts/new.html.erb

<%= f.file_field :image %>

5. Postモデルの単体テストコード修正

ダミー画像を用意
「public」ディレクトリの中に「images」というディレクトリを作成し、ダウンロードした画像を、imagesディレクトリの中に配置
FactoryBotの編集
afterメソッドを用いて、生成するダミーデータに画像を添付
spec/factories/posts.rb

after(:build) do |post|
  post.image.attach(io: File.open('public/images/test_image.png'), filename: 'test_image.png')
end

テストコードを実装し、テストを実行
ターミナル

bundle exec rspec spec/models/post_spec.rb

stashしたブランチを元に戻し、投稿一覧表示機能の修正

1. ビュー、ファイルの修正

保存した画像を表示
image_tagメソッドを記述して、画像を表示させる
なお、投稿画像が存在しない場合は、no imageファイルを表示する
app/views/posts/index.html.erb

<%= image_tag post.image, class: 'post-image' if post.image.attached? %>
<%= image_tag 'noimage.png', class: 'post-image' unless post.image.attached? %>

no imageファイルを表示させようとしたが、最初下記エラーが出た
Sprockets::Rails::Helper::AssetNotFound
The asset "noimage.png" is not present in the asset pipeline.
これはasset配下に画像ファイルが存在しないため起こるエラーである
→テストコードの実装の時にpublic配下に画像を保存していたので、それでいけると思ってしまった
その他も投稿内容を一覧表示させるよう編集
ついでにヘッダー、フッターも少し編集

※検索機能、人気順表示、いいね機能等も実装予定だが、別のブランチで作業する

2. rubocop

次回

マイページを実装し、個人の投稿一覧表示ができるようにする