セレクトメニューの選択項目に応じて、もう1つのセレクトメニューの内容を変更する
ひとまずメモ。
覚え書き
- Rubyの配列のinspect結果(#Array.inspect)が、javascriptの配列の表現と良く似ていることを利用する。nil表現だけ違うので、gsubで変更。
- Railsのselectヘルパーを使うと、変更するSELECTタグのname属性に[]が入ってしまってjavascript的に許されない名前っぽいので、selectヘルパーは使わない。
View
<h1>アップロードフォーム</h1>
<%= start_form_tag({:action => 'save'}, {:multipart => true, :name => 'upload_form'}) %>
<p>
<b>ファイル:</b>
<%= file_field "data_file", "file_data" %>
</p>
<script language="JavaScript"><!--
menuItem = <%= @menus.inspect.gsub("nil,", "null,") %> ;
function setMenuItem(select_obj) {
n = select_obj.value;
s = document.upload_form.search_key;
max_num = menuItem[n].length;
for (i = s.length - 1; i >= max_num ; i--) { s.options[i] = null; }
for (i = 0; i < max_num; i++) {
s.options[i] = new Option(menuItem[n][i][0],menuItem[n][i][1]);
}
}
// --></script>
<p id="search_keys">
<b>項目:</b>
<%= select 'article', 'id', @articles.map{|a| [ a.name, a.id ]}, {}, { 'onChange' => 'setMenuItem(this)'} %>
<b>検索キー:</b>
<select name="search_key">
<% @search_keys.each do |search_key| -%>
<option value="<%= search_key.id %>"><%= search_key.name %></option>
<% end -%>
</select>
</p>
<%= submit_tag "Upload" %>
<%= end_form_tag %>
Controller
class UploadController < ApplicationController
def index
@articles = Article.find(:all)
@article = @articles[0]
@menus = []
@articles.each do |a|
@menus[a.id] = SearchKey.find(:all, :conditions => ["article_id = ?", a.id]).map{|s| [s.name, s.id]}
end
@search_keys = SearchKey.find(:all, :conditions => ["article_id = ?", @article.id])
@data_file = DataFile.new
@search_key = @search_keys[0]
end
end