サンプルアプリケーション
opal-viteには、Stimulus APIの様々な機能をデモンストレーションするサンプルアプリケーションが含まれています。
Counter App
Stimulus Values APIを使用したシンプルなカウンターアプリケーション。
デモンストレーションする機能:
stimulus_value(:name)- 値の取得set_stimulus_value(:name, value)- 値の設定increment_stimulus_value(:name)- 数値のインクリメントdecrement_stimulus_value(:name)- 数値のデクリメント- 値変更コールバック (
count_value_changed)
ディレクトリ: examples/counter-app/
ruby
class CounterController < StimulusController
include OpalVite::Concerns::V1::StimulusHelpers
self.values = { count: :number }
self.targets = ["display"]
def connect
update_display
end
def increment
increment_stimulus_value(:count)
end
def decrement
decrement_stimulus_value(:count)
end
def reset
set_stimulus_value(:count, 0)
end
def count_value_changed
update_display
end
private
def update_display
target_set_text(:display, stimulus_value(:count).to_s)
end
endローカルで実行:
bash
cd examples/counter-app
bundle install
pnpm install
pnpm devCRUD App
Stimulus Action Parametersを使用したCRUD(作成・読取・更新・削除)アプリケーション。
デモンストレーションする機能:
action_param(:name)- アクションパラメータの取得action_param_int(:id)- 整数パラメータの取得has_action_param?(:name)- パラメータ存在チェックdata-[controller]-[name]-paramHTML属性構文- イベント通信を使ったモーダルダイアログ
ディレクトリ: examples/crud-app/
ruby
class ListController < StimulusController
include OpalVite::Concerns::V1::StimulusHelpers
self.targets = ["container", "template", "nameInput"]
self.values = { items: :array }
def edit
# data-list-id-param, data-list-name-param属性からパラメータを取得
id = action_param_int(:id)
name = action_param(:name)
quantity = action_param_int(:quantity, 1) if has_action_param?(:quantity)
dispatch_window_event('open-modal', { id: id, name: name, quantity: quantity })
end
def delete
id = action_param_int(:id)
# ... 削除ロジック
end
endアクションパラメータを使ったHTML:
html
<button data-action="click->list#edit"
data-list-id-param="123"
data-list-name-param="アイテム名"
data-list-quantity-param="5">
編集
</button>ローカルで実行:
bash
cd examples/crud-app
bundle install
pnpm install
pnpm devTabs App
Stimulus OutletsとDispatchを使用したタブインターフェース。
デモンストレーションする機能:
- アウトレット接続 (
self.outlets = ["panel"]) has_outlet?(:name)- アウトレット存在チェックcall_outlet(:name, :method)- アウトレットのメソッド呼び出しcall_all_outlets(:name, :method)- 全アウトレットのメソッド呼び出しdispatch_window_event(name, detail)- カスタムイベントのディスパッチon_window_event(name)- ウィンドウイベントのリッスン
ディレクトリ: examples/tabs-app/
ruby
# タブコントローラー
class TabsController < StimulusController
include OpalVite::Concerns::V1::StimulusHelpers
self.targets = ["tab"]
self.outlets = ["panel"]
def select
index = action_param_int(:index)
activate_tab(index)
show_panel_by_index(index)
end
private
def show_panel_by_index(index)
# アウトレット経由で全パネルを非表示
call_all_outlets(:panel, :hide) if has_outlet?(:panel)
# パネル表示用のイベントをディスパッチ
dispatch_window_event('tabs:change', { index: index })
end
end
# パネルコントローラー
class PanelController < StimulusController
include OpalVite::Concerns::V1::StimulusHelpers
def connect
on_window_event('tabs:change') do |event|
detail = `#{event}.detail`
index = `#{detail}.index`
my_index = action_param_int(:index)
index == my_index ? show : hide
end
end
def show
element_remove_class('panel-hidden')
end
def hide
element_add_class('panel-hidden')
end
endローカルで実行:
bash
cd examples/tabs-app
bundle install
pnpm install
pnpm devテストの実行
各サンプルアプリにはCapybara + Cupriteを使ったE2Eテストが含まれています:
bash
cd examples/counter-app
pnpm dev &
bundle exec rspec本番ビルド
全てのサンプルアプリは本番ビルドをサポートしています:
bash
cd examples/counter-app
pnpm build # 本番用ビルド
pnpm preview # 本番ビルドのプレビュー