質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

1143閲覧

Active Recordを使った画像のリサイズができない

Utsubo

総合スコア15

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

ImageMagick

ImageMagickとは、画像の表示や操作を行うオープンソースのソフトウェアです。プログラムはCで書かれており、GIFやJPEG、PDFなど画像ファイルフォーマット100種類以上に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2022/08/13 16:33

前提

Railsチュートリアル13章を勉強しております。
RailsチュートリアルではRails6で説明されていますが、私はRails7を使用しております。
ただ、解説はないのですが、Rails7で実装されたコードがGitHub上で公開されているので、Rails6での解説 + GitHubで公開されているRails7で実装されたコードを見ながら学習しております。

その中でActive Storageを使って画像のアップロード、画像の検証(ファイルの種類、ファイルのバイト数)の機能を実装し、画像が表示されることを確認しました。
イメージ説明

実現したいこと

画像のリサイズ機能を追加したい。

発生している問題・エラーメッセージ

画像のリサイズ機能を実装した際に下図のように、適切に画像が表示されない問題が発生しました。
イメージ説明

該当のソースコード

公開されているRails7で書かれたRailsチュートリアルのコードは下記です。
https://github.com/yasslab/sample_apps/tree/main/7_0/ch13

_micropost.html.erbファイルの7行目、micropost.image.variant(:display)だと画像はうまく表示されませんが、リサイズを行わないmicropost.imageだけだとうまく表示されます。
下記のような別の記法も試しましたがダメでした。
micropost.image.variant(resize: "100x100")
micropost.image.variant(resize_to_limit: [100, 100])

以下に私が書いたコードを記載します。
app/views/microposts/_micropost.html.erb

ruby

1<li id="micropost-<%= micropost.id %>"> 2 <%= link_to gravatar_for(micropost.user, size: 50), micropost.user %> 3 <span class="user"><%= link_to micropost.user.name, micropost.user %></span> 4 <span class="content"> 5 <%= micropost.content %> 6 <% if micropost.image.attached? %> 7 <%= image_tag micropost.image.variant(:display) %> 8 <% end %> 9 </span> 10 <span class="timestamp"> 11 Posted <%= time_ago_in_words(micropost.created_at) %> ago. 12 <% if current_user?(micropost.user) %> 13 <%= link_to "delete", micropost, data: { "turbo-method": :delete, turbo_confirm: "You sure?" } %> 14 <% end %> 15 </span> 16</li>

app/models/micropost.rb

ruby

1class Micropost < ApplicationRecord 2 belongs_to :user 3 has_one_attached :image do |attachable| 4 attachable.variant :display, resize_to_limit: [500, 500] 5 end 6 default_scope -> { order(created_at: :desc) } 7 validates :user_id, presence: true 8 validates :content, presence: true, length: { maximum: 140 } 9 validates :image, content_type: { in: %w[image/jpeg image/gif image/png], 10 message: "must be a valid image format" }, 11 size: { less_than: 5.megabytes, 12 message: "should be less than 5MB" } 13end

Gemfile

ruby

1source "https://rubygems.org" 2git_source(:github) { |repo| "https://github.com/#{repo}.git" } 3 4ruby "3.1.2" 5 6gem "rails", "~> 7.0.3", ">= 7.0.3.1" 7gem "sprockets-rails" 8gem "bootstrap-sass", "3.4.1" 9gem "pg", "~> 1.1" 10gem "puma", "~> 5.0" 11gem "importmap-rails" 12gem "turbo-rails" 13gem "stimulus-rails" 14gem "jbuilder" 15gem "tzinfo-data", platforms: %i[ mingw mswin x64_mingw jruby ] 16gem "bootsnap", require: false 17gem "bcrypt" 18gem "faker" 19gem "will_paginate" 20gem "bootstrap-will_paginate" 21gem "active_storage_validations", "0.9.7" 22gem "image_processing", "1.12.2" 23 24group :development, :test do 25 gem "debug", platforms: %i[ mri mingw x64_mingw ] 26end 27 28group :development do 29 gem "web-console" 30end 31 32group :test do 33 gem "capybara" 34 gem "selenium-webdriver" 35 gem "webdrivers" 36 gem "rspec-rails" 37 gem "factory_bot_rails" 38end

試したこと

下記のRailsガイドを参照し、variantメソッドの書き方が間違っていないか確認しました。
https://railsguides.jp/active_storage_overview.html#has-one-attached

Rails7で書かれたRailsチュートリアルのコードと自分のコードを何回も見比べ、間違いがないか確認しました。

ネットで同様の事象がないか検索しました。よくある原因は以下のようなものでした。
・ImageMagickをインストールしていない
→ homebrewでインストールしたことを確認しました
・gem mini_magickをbundle installできていない
→ gem image_processingをbundle installしているので、今回は不要と判断しました。下記の記事にあるように、image_processingをインストールすると自動でmini_magickもインストールされるようです。
https://qiita.com/fgem28/items/54c5ca70753f16ef420c
また、Rails7で書かれたRailsチュートリアルのコードのGemifileを確認しても記載されていなかったため、不要だと考えました。

補足情報(FW/ツールのバージョンなど)

OS:macOS Big Sur Version 11.4
ruby: 3.1.2
Rails: 7.0.3.1
ImageMagick: 7.1.0-45

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

config/application.rb内にどのgemを使って画像処理するかを設定したところ、解決しました。

ruby

1module SampleApp 2 class Application < Rails::Application 3 config.load_defaults 7.0 4 config.active_storage.variant_processor = :mini_magick # 追加 5 6 config.action_mailer.preview_path = "#{Rails.root}/spec/mailers/previews" 7 end 8end 9

下記のサイトやRailsガイドでは「デフォルトではMiniMagickが設定されて、画像処理されますが、vipsを使いたい場合はRails.application.config.active_storage.variant_processor = :vipsのように記載します」のようなことが書かれていましたが、明記する必要があったのかもしれません。
https://edgeapi.rubyonrails.org/classes/ActiveStorage/Variant.html

投稿2022/08/15 03:15

Utsubo

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問