1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rails 7でフォームのファイル選択時にファイル名を表示する方法(Stimulus使用)

Posted at

はじめに

フォームでファイルを選択した際、選択したファイル名を表示したい場面がありますよね?Rails 7では、Stimulusを使うことでシンプルに実現できます。この記事では、ファイル名を表示する機能を、Stimulusを活用して実装する方法を解説します。

実現したいこと

以下のフォームのように、ファイルを選択するとそのファイル名をフォームの下に表示する仕組みを作ります。

動作イメージ

特徴:

  • 複数ファイルを選択可能。
  • ファイル名が長い場合は30文字で切り詰めて表示(トランケート)。

実装手順

1. Stimulusコントローラを作成

Rails 7ではStimulusがデフォルトで導入されているため、Stimulusコントローラを作成します。

以下のコマンドを実行して、新しいStimulusコントローラを生成します:

bin/rails generate stimulus file_input

これにより、app/javascript/controllers/file_input_controller.js が作成されます。

2. コントローラにロジックを追加

file_input_controller.jsに、ファイル選択時に名前を表示する機能を追加します。

修正後のコード

import { Controller } from "@hotwired/stimulus";

// Connects to data-controller="file-input"
export default class extends Controller {
  static targets = ["input", "fileNames"]; // ファイル入力と名前表示用ターゲットを定義

  connect() {
    // ファイル選択時にイベントをトリガー
    this.inputTarget.addEventListener("change", this.displayFileNames.bind(this));
  }

  displayFileNames(event) {
    // 選択されたファイルリストを取得
    const files = Array.from(this.inputTarget.files);
    // ファイル名をトランケートして表示
    const truncatedFileNames = files.map((file) => {
      const maxLength = 30; // 最大文字数
      return file.name.length > maxLength
        ? file.name.substring(0, maxLength) + "..."
        : file.name;
    });

    // ファイル名をリストとしてHTMLに挿入
    this.fileNamesTarget.innerHTML = `
      <ul>
        ${truncatedFileNames.map((name) => `<li>${name}</li>`).join("")}
      </ul>
    `;
  }
}

3. ビューでStimulusコントローラを適用

Stimulusコントローラをフォームに適用します。data-controllerdata-target属性を利用して、ファイル選択フィールドとファイル名表示エリアを関連付けます。

修正後のフォーム(例: app/views/documents/_form.html.erb

<div data-controller="file-input">
  <div class="field">
    <%= form.label :files, "Attach Files" %>
    <%= form.file_field :files, multiple: true, data: { target: "file-input.input" } %>
  </div>
  <div id="file-names" data-target="file-input.fileNames"></div> <!-- ファイル名を表示 -->
</div>

4. Stimulusを読み込む

Stimulusコントローラを有効にするために、エントリーポイント(app/javascript/application.js)でStimulusをロードします。

修正後のapp/javascript/application.js

// Load all Stimulus controllers
import "./controllers";

5. 動作確認

以下を確認してください:

  1. ファイル選択時に名前が表示されること

    • フォームでファイルを選択すると、ファイル名が表示されます。
    • 長いファイル名は30文字にトランケートされます。
  2. 複数ファイルを選択可能

    • 複数ファイルを選択すると、全てのファイル名がリスト表示されます。

まとめ

Rails 7ではStimulusを使うことで、フロントエンドの機能を簡単に拡張できます。ファイル選択時に名前を表示する仕組みも、わずか数ステップで実現可能です。

ポイント

  • Stimulusのdata-targetでHTML要素を簡単に管理。
  • 長いファイル名はJavaScriptで切り詰めて表示。

これでフォームのUXが向上します!ぜひ試してみてください。

1
0
1

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?