Skip to content

StimulusHelpers API ​

Stimulus コントローラで使用するためのヘルパーメソッド集です。JavaScript のバッククォート記法を減らし、Ruby らしいコードを書けます。

使用方法 ​

ruby
require 'opal_vite/concerns/v1/stimulus_helpers'

class MyController < StimulusController
  include OpalVite::Concerns::StimulusHelpers
end

Target 操作 ​

has_target?(name) ​

ターゲットが存在するかチェック

ruby
if has_target?(:input)
  # 処理
end

get_target(name) ​

ターゲット要素を取得

ruby
element = get_target(:input)

get_targets(name) ​

同名の全ターゲットを配列で取得

ruby
items = get_targets(:item)
items.each { |item| ... }

target_value(name) / target_set_value(name, value) ​

ターゲットの value 属性の取得/設定

ruby
text = target_value(:input)
target_set_value(:input, 'new value')

target_html(name) / target_set_html(name, html) ​

ターゲットの innerHTML の取得/設定

ruby
html = target_html(:output)
target_set_html(:output, '<p>Hello</p>')

target_text(name) / target_set_text(name, text) ​

ターゲットの textContent の取得/設定

ruby
text = target_text(:label)
target_set_text(:label, 'New Label')

target_clear(name) ​

ターゲットの value をクリア

ruby
target_clear(:input)  # value = ''

target_focus(name) / target_blur(name) ​

ターゲットにフォーカス/アンフォーカス

ruby
target_focus(:input)

Target クラス操作 ​

add_target_class(name, class_name) ​

ターゲットにクラスを追加

ruby
add_target_class(:container, 'active')

remove_target_class(name, class_name) ​

ターゲットからクラスを削除

ruby
remove_target_class(:container, 'active')

toggle_target_class(name, class_name) ​

ターゲットのクラスをトグル

ruby
toggle_target_class(:panel, 'expanded')

has_target_class?(name, class_name) ​

ターゲットがクラスを持つかチェック

ruby
if has_target_class?(:button, 'disabled')
  # 処理
end

Target スタイル操作 ​

show_target(name) / hide_target(name) ​

ターゲットの表示/非表示

ruby
show_target(:modal)
hide_target(:modal)

toggle_target_visibility(name) ​

表示状態をトグル

ruby
toggle_target_visibility(:dropdown)

set_target_style(name, property, value) ​

スタイルプロパティを設定

ruby
set_target_style(:box, 'backgroundColor', '#ff0000')

イベント ​

dispatch_event(name, detail = {}) ​

コントローラ要素でカスタムイベントを発火

ruby
dispatch_event('todo:added', { id: 1, text: 'New todo' })

dispatch_window_event(name, detail = {}) ​

window でカスタムイベントを発火

ruby
dispatch_window_event('theme:changed', { theme: 'dark' })

on_window_event(name, &block) ​

window のイベントをリッスン

ruby
on_window_event('resize') do |event|
  console_log('Window resized')
end

on_controller_event(name, &block) ​

コントローラ要素のイベントをリッスン

ruby
on_controller_event('click') do |event|
  console_log('Clicked!')
end

prevent_default ​

デフォルト動作を防止

ruby
def submit(event)
  prevent_default
  # フォーム処理
end

event_key ​

キーボードイベントのキー名を取得

ruby
def keydown(event)
  if event_key == 'Enter'
    submit_form
  end
end

タイマー ​

set_timeout(delay, &block) ​

遅延実行

ruby
timer_id = set_timeout(1000) do
  console_log('1秒後に実行')
end

set_interval(delay, &block) ​

繰り返し実行

ruby
interval_id = set_interval(5000) do
  fetch_updates
end

clear_timeout(timer_id) / clear_interval(timer_id) ​

タイマーをキャンセル

ruby
clear_timeout(timer_id)
clear_interval(interval_id)

LocalStorage ​

storage_get(key) / storage_set(key, value) ​

文字列の取得/保存

ruby
value = storage_get('theme')
storage_set('theme', 'dark')

storage_get_json(key, default = nil) / storage_set_json(key, value) ​

JSON の取得/保存

ruby
todos = storage_get_json('todos', [])
storage_set_json('todos', todos)

storage_remove(key) ​

キーを削除

ruby
storage_remove('temp_data')

DOM クエリ ​

query(selector) / query_all(selector) ​

document 全体からクエリ

ruby
element = query('#main')
items = query_all('.item')

query_element(selector) / query_all_element(selector) ​

コントローラ要素内からクエリ

ruby
input = query_element('input[type="text"]')
buttons = query_all_element('button')

DOM 操作 ​

create_element(tag) ​

要素を作成

ruby
div = create_element('div')

append_child(parent, child) ​

子要素を追加

ruby
list = get_target(:list)
item = create_element('li')
append_child(list, item)

remove_element(element) ​

要素を削除

ruby
remove_element(get_target(:item))

set_html(element, html) / set_text(element, text) ​

innerHTML / textContent を設定

ruby
set_html(element, '<strong>Bold</strong>')
set_text(element, 'Plain text')

要素クラス/属性 ​

add_class(element, class_name) / remove_class(element, class_name) ​

クラスの追加/削除

ruby
add_class(element, 'active')
remove_class(element, 'hidden')

toggle_class(element, class_name) ​

クラスをトグル

ruby
toggle_class(element, 'expanded')

set_attr(element, attr, value) / get_attr(element, attr) ​

属性の設定/取得

ruby
set_attr(button, 'disabled', 'true')
value = get_attr(input, 'data-id')

focus(element) ​

要素にフォーカス

ruby
focus(get_target(:input))

Fetch API ​

fetch_json(url, &success_block) ​

JSON を取得してコールバック

ruby
fetch_json('/api/todos') do |data|
  console_log('Got todos:', data)
end

fetch_json_with_handlers(url, on_success:, on_error:) ​

成功/エラーハンドラ付き

ruby
fetch_json_with_handlers('/api/data',
  on_success: ->(data) { process(data) },
  on_error: ->(error) { show_error(error) }
)

fetch_all_json(urls) ​

複数 URL を並列取得

ruby
promise = fetch_all_json(['/api/a', '/api/b'])
js_then(promise) do |results|
  console_log(results)
end

Promise ​

js_then(promise, &block) ​

Promise の成功時処理

ruby
promise = fetch_json_promise('/api/data')
js_then(promise) do |data|
  console_log(data)
end

js_catch(promise, &block) ​

Promise のエラー時処理

ruby
js_catch(promise) do |error|
  console_error('Error:', error)
end

promise_all(promises) ​

全 Promise の完了を待機

ruby
all = promise_all([promise1, promise2])

型変換 ​

parse_int(value, radix = 10) ​

整数にパース

ruby
num = parse_int('42')
hex = parse_int('ff', 16)

parse_float(value) ​

浮動小数点にパース

ruby
num = parse_float('3.14')

parse_int_or(value, default = 0) ​

パース失敗時にデフォルト値を返す

ruby
num = parse_int_or('abc', 0)  # => 0

JSON ​

json_parse(json_string) ​

JSON 文字列をパース

ruby
data = json_parse('{"key": "value"}')

json_stringify(obj) ​

オブジェクトを JSON 文字列に

ruby
json = json_stringify({ key: 'value' })

コンソール ​

console_log(*args) / console_warn(*args) / console_error(*args) ​

コンソール出力

ruby
console_log('Debug:', data)
console_warn('Warning!')
console_error('Error:', error)

日付/時刻 ​

js_timestamp ​

現在のタイムスタンプ(ミリ秒)

ruby
now = js_timestamp

js_date(value = nil) ​

Date オブジェクト作成

ruby
now = js_date
specific = js_date('2024-01-01')

js_iso_date ​

ISO 形式の日付文字列

ruby
iso = js_iso_date  # => "2024-01-01T00:00:00.000Z"

数学 ​

js_random ​

0-1 のランダム値

ruby
r = js_random

random_int(max) ​

0 から max-1 のランダム整数

ruby
dice = random_int(6) + 1

js_min(a, b) / js_max(a, b) ​

最小値/最大値

ruby
smaller = js_min(10, 20)
larger = js_max(10, 20)

js_abs(num) / js_round(num) / js_floor(num) / js_ceil(num) ​

数学関数

ruby
absolute = js_abs(-5)
rounded = js_round(3.7)

グローバルオブジェクト ​

js_global_exists?(name) ​

グローバル変数の存在チェック

ruby
if js_global_exists?('Chart')
  # Chart.js が読み込まれている
end

js_global(name) ​

グローバル変数を取得

ruby
chart_class = js_global('Chart')

js_new(klass, *args) ​

JavaScript クラスのインスタンス作成

ruby
chart = js_new(js_global('Chart'), canvas, options)

Released under the MIT License.