記事を書いた理由
Stimulus-Sortableを利用してドラックアンドドロップを実装したのですが、その時Stimulusのファイル構成がどんな感じになっているかわからなかったので、その備忘録です
環境
- Rails 8
- Ruby 3.3.6
stimulusとは何か
Javascriptのフレームワークです
CSSにおけるBootstrap、RubyにおけるRuby on Railsと同じです
何ができるのか
HTML要素にデータ属性を追加して、JavaScriptのコントローラーと関連づけ、HTML要素を良い感じに操作できます
それを簡単に行えちゃうフレームワークです
「 Turbo + Stimulus」の2つを組み合わせてHotwireという技術で使用されています(Stradaもあるので本当は3つ)
説明するファイルについて
Rails7からディフォルトでstimulus-rails
gemが入りました
ここではapp/javascript
配下にある3つのファイルについてアウトプットします
app/javascript/application.js
- javascriptのエントリーポイント、アプリが読み込まれて最初に動き始める場所
- application.html.erbの
javascript_include_tag
で読み込まれる
// Entry point for the build script in your package.json
import "@hotwired/turbo-rails";
import "./controllers";
Turboとapp/javascript/controller/index.js
のファイルをインポートしています
app/javascript/controller/index.js
に記述されたStimulusコントローラはここで読み込まれるようになります
app/javascript/application.js
- Stimulusアプリケーションの初期化を担当するファイル
import { Application } from "@hotwired/stimulus";
const application = Application.start();
export { application };
Application.start()
を呼び出して、Stimulusアプリケーションを開始、これにより、StimulusがDOM内のコントローラを検出し、管理できるようになります
export { application }
でapplication
を他のファイルでインポートできるようにします
app/javascript/controllers/index.js
- Stimulusコントローラを一元的に登録する場所
- このファイルは、各コントローラをインポートし、Stimulusアプリケーションに登録します。これにより、コントローラがDOM内で適切に動作するようになる
// This file is auto-generated by ./bin/rails stimulus:manifest:update
// Run that command whenever you add a new controller or create them with
// ./bin/rails generate stimulus controllerName
import { application } from "./application"
import HelloController from "./hello_controller"
application.register("hello", HelloController)
./bin/rails generate stimulus controllerName
コマンドでコントローラを作成するタイミングで、自動生成されるファイルです
基本的に追加したコントローラは、index.js
に自動で追加されます
補足:app/javascript/controllers/hello_controller.js
ディフォルトだとhello_controller.js
というファイルがあります
ただHello World!
を返すだけのコントローラです
基本的には削除してしまった問題ありませんが、手動でコントローラを追加する場合はこれを模倣する感じです
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
connect() {
this.element.textContent = "Hello World!"
}
}
コントローラを追加するとき
基本的には./bin/rails generate stimulus controllerName
コマンドで任意のコントローラ名でファイルを作成します
その後、そのファイル内で使用したいコントローラをimport
して、export
してあげる
自動で追記されたindex.js
が読み込む
という流れでコントローラを追加します
感想
- JSの知見が少なく、ファイル構成をパッと見ただけではなかなか理解できませんでした…
参考