ユーザビリティの向上のため、obseve_fieldを使ってみる。
ActionHelperの一つなんだけど、
ターゲットの出すイベントで非同期のアクションを呼び出してくれる。
使い方は簡単。ビューに埋め込む。
<div id="<%= observe_update_id %>">
<%= check_box_tag observe_target_id, value %>
<%= observe_field observe_target_id,
{:on=>'change',
:update=>observe_update_id,
:with=>"'value_param_name='+(value)",
:url=>{:controller=>'controller_name',
:action=>'action_name',
:addtion_param=>addition_param_vaule}}%>
</div>
とこんな感じ。
observe_fieldの第一引数に監視するフィールドのIDを入れておき、
:updateオプションに更新したい要素のIDを入れておく。
サンプルの場合、チェックボックスのチェックを入れたり、外したりしたときにアクションが発生して、
自分自身が含まれる要素を書き換えることになる。
自分以外の所に指定してやれば、結果が返ってくる。
自分以外の所に指定して、そのIDも動的に生成してやれば、再帰的に呼び出すことも可能。
呼び出し先はurl_forの形式なので、固定的なパラメータはここに埋め込んでやればいい。
問題なのは、監視対象のフィールドの値をどうやって送るか。
:withオプションを指定しないときは、
value = request.raw_post || request.query_string
で受け取るらしい。
なんか生っぽくて気持ちが悪いのっで、出来ればparams[:name] = valueで受け取りたい。
で、:withオプションに
"'value_param_name='+(value)"
と指定してやる。ダブルクオートとシングルクオートが入り交じっているのは、
:withオプションの中身をJavascriptが評価するから。
ちなみにテキストフィールドなんかで定期的に評価したいときは、
:onオプションをやめて、
:frequencyオプションに秒数を入れてやればいい。
:onオプションには、change以外にもイベントを指定できる。
いやあ、便利便利。
PR