Help us understand the problem. What is going on with this article?

Railsのactive_storageとmini_magick使ってみる

初めに

ActiveStorageという機能があってすごく便利だったのでやり方をまとめる

active_storage:install

active_storageを使うにはコンソールで

rails active_storage:install

を行う。
そうすると必要なファイルが作られるのでrails db:migrateする

保存、表示

モデルファイルに

has_one_attached :image

と書くか、もしくは

has_many_attached :images

と書く

has_one_attachedはそのモデルに一つの画像を紐づける場合に使ってhas_many_attachedは複数の画像を紐づけるときに使う。

もちろんhas_many_attached :imagesとかいたらimagesは配列としてわたるので

表示する際に

<%= image_tag(@post.images) %>

と書くとうまくいかないので

<% images.count.times do |i| %>
  <%= image_tag(@post.images[i]) %>
<% end %>

みたいにする。

has_one_attached :image の場合は一つしか画像を紐づけていないので

<%= image_tag(@post.image) %>

で画像を表示できる。

画像投稿

画像を投稿する際には

has_one_attached :image の場合は

投稿フォームに(postモデルに紐づけている場合)

<%= form_with(model: post, local: true) do |f| %>

  #省略

  <%= f.label :image %>
  <%= f.file_field :image %>

  <%= f.submit %>
<% end %>

でOK

コントローラーには

def create
  @post = Post.create(post_params)
end

private

def post_params
  params.require(:post).permit(:image,:何か,:何か)
end 

て感じで書いておけば大丈夫

has_many_attached :images の場合は

フォームの

<%= f.file_field :image %>

のところを

<%= f.file_field :images, multiple: true %>

書けばOK

コントローラーには

def create
  @post = Post.create(post_params)
end

private

def post_params
  params.require(:post).permit(images: [],:何か,:何か)
end 

みたいに書く

mini_magick

mini_magickを使えば画像にいろいろできる(語彙力....)

とりあえずGemfileに

gem 'mini_magick', '~> 4.8'

を追加する。 おそらくコメントアウトされてあるのでそれを使う

このmini_magickを使う場合image_magickを使う必要がある。

このimage_magickだがwindows環境でうまく使えなかった(自分だけかもしれないが....)

だがWSLでubuntuを使ってやってみたところうまくいった。

ubuntuでimage_magickをインストールするには

sudo apt-get install imagemagick

と書けばいける

mini_magickの使い方だが画像に対して

image.resize "100x100"
=>リサイズ
image.path 
=> 画像の名前表示

みたいな感じ

詳しくは
https://github.com/minimagick/minimagick

画像を表示する際にその画像をリサイズしたい場合は

post.rb
def thumbnail
  return self.image.variant(resize: '300x300').processed
end

とかいてview側で

<%= image_tag(@post.thumbnail) %>

と書いてやるようです。

active_storageのvalidation

アクティブストレージで保存する画像に対してバリデーションをするには

models/post.rbに

validate :image_type

def image_type
  if image.attached? && image.content_type.in?(%("image/jpeg image/png"))
    errors.add(:image, 'error message')
  elsif !image.attached?
    errors.add(:image, 'error message')
  end
end 

みたいにやるそうです。

参考にしたサイト

Dean Active Storage For Multiple Images | Validate & Resize | Ruby on Rails 5.2
https://www.youtube.com/watch?v=A23zCePXe74&t=617s

sibakenY
大学卒業後Ruby, Ruby on Railsを勉強しています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away