.js.erbに配列を渡して、HTML書き換えを行う。

前回の記事であった「selectedの値を非同期で書き換える」を実現するための方法。

手順としては

  1. コントローラでJSON化した配列を準備。
  2. 置き換えを行いたいelementに同じclassを指定しておき、Jqueryですべて取得
  3. 繰り返し処理を行いその回数をindexで取得。配列のindexとして利用して書き換えを行う。

お題を少し変えて、「表の列数分だけ列車名の置き換えを非同期で行う。」にした。

ビューでは以下のようにclassを指定し、書き換えを行うターゲットのマーカーとしている。

<table class="trains_table">                                                                                                         
 <tr><td>東海道線</td><td class="express">踊り子 </td></tr>
 <tr><td>内房線</td><td class="express">しおさい</td></tr>
 <tr><td>中央線</td><td class="express">あずさ</td></tr>
 <tr><td>高山本線</td><td class="express">ひだ</td></tr>
 <tr><td>高崎線</td><td class="express">みなかみ</td></tr>
 <tr><td>常磐線</td><td class="express">ひたち</td></tr>
</table>

コントローラーは以下のようにJSONに変換している

def table                                                                                                                                             
@array = ["スーパービュー踊り子","あやめ","かいじ","ワイドビューひだ","スワローあかぎ","スーパーひたち"].to_json.html_safe
   respond_to do |format|
    format.js
   end
end

ajaxで返されるJSファイルは以下のように指定している。

  $(".express").each(function(index,element){                                                                                                                
    console.log(index + $(element).text());
    var array = <%= @array %>;
    $(element).text(array[index]);
  })

each文の回数はindexで取得することが出来る。これを配列のindexの要素取得に利用している。

これで、データベースから取得した、すでに選択されている選択肢を配列で所得し、その順番に応じてHTMLの書き換えでselectedを書き換える、ということが可能になる。