Rails Ambassador

Rails7でActionText(リッチテキストエディタ)を使用する!

ActiveStorageにリッチテキストを保存することができます。
ruby 3.2.1
Rails 7.0.4.3

https://railsguides.jp/active_storage_overview.html
https://railsguides.jp/action_text_overview.html

動作確認日:2023/5/20

プロジェクトの作成

今回はMessagesというアプリ名で作成します。
rails new messages
作成したアプリのディレクトリに移動しましょう。
cd messages

インストール

rails action_text:install
こちらのコマンドを実行すると必要なマイグレーションがdb/migrateフォルダ内に作成されます。
こちらをデータベースに反映させるため、データベースを作成してからマイグレーションを実行しましょう。
rails db:create
rails db:migrate

モデルの作成

Messageモデルにリッチテキストのフィールドcontentを追加する例です。今回はタイトルも付けられるようにします。以下のコマンドを実行しましょう。
rails generate model Message title content:rich_text
作成されたマイグレーションファイルを実行してください。
※messagesテーブルにcontentフィールドを追加する必要はありません。
rails db:migrate
モデルを以下のように編集しcontentをリッチテキストの指定をしましょう。
# app/models/message.rb
class Message < ApplicationRecord
  has_rich_text :content
end

コントローラの作成

コントローラを作成しましょう。indexのViewで入力フォームと一覧を表示させるので、indexのview付きで作成します。
rails g controller messages index
コントローラで受け取れるようにします。
#app/controllers/messages/controller.rb
class MessagesController < ApplicationController
  def index
    @message = Message.new
    @messages = Message.with_rich_text_content_and_embeds 
  end

  def create
    message = Message.create(message_params)
    message.save
    redirect_to root_url
  end

  private
  def message_params
    params.require(:message).permit(:title, :content)
  end
end
config/routes.rbを編集し、Messages#IndexをTOPページに指定し、登録できるようにcreateアクションも登録します。
Rails.application.routes.draw do
  root 'messages#index'
  resources :messages, only: [:create]
end

Viewを作成

メッセージを入力するフォームを作成します。
content属性にはrich_text_areaを指定します。
#app/views/messages/_form.html.erb
<h1>メッセージ作成</h1>
<%= form_with model: @message do |form| %>
  <div class="field">
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>
  <div class="field">
    <%= form.label :content %>
    <%= form.rich_text_area :content %>
  </div>
  <%= form.submit %>
<% end %>
こちらのフォームの下に表示用のViewも追加します。サニタイズ(無害化)済みのテキストになります。
<% @messages.each do |message| %>
<%= message.title %>
<div class="trix-content">
  <%= message.content %>
</div>
<% end %>

画像をactive-storageに保存できるようにする

画像加工用にLibvipsをインストールします。
Ubuntu
sudo apt update
sudo apt install -y libvips
RedHat系
sudo yum install -y epel-release
sudo yum install -y vips

Tips!

Libvipsの代わりにImageMagickを使用することもできます。 インストール済みの方はconfig/application.rbに以下を追加すると画像を使用することができます。
config.active_storage.variant_processor = :mini_magick

動作確認

Messagesアプリケーションのディレクトリでサーバを起動してブラウザでlocalhost:3000にアクセスして動作確認を行ってください。
rails s