【rails】observe_fieldについて
業務で実装する機能で、observe_fieldを使う機会があったので、まとめておく。
- 具体的にしたいこと
- 1つのselectで、ある値を設定したら、別のselectのプルダウンの選択肢が特定されるようにしたい。
- 実際のコード
- まずは監視されるselectを作成する。
animal = [["cat", "cat"], ["dog", "dog"], ["horse", "horse"]] <%= select(:hoge, :fuga_id, animal) %>
- 次に変更されるselectを用意する。
# _animal.rhtml ファイル <div id = "animal"> <% if @animals.blank? -%> <% @number = [] -%> <% else -%> <% select_number = [] -%> <% 1.upto(@animals){ |i| select_number << i } -%> <% @number = select_number.collect{|i| [i, i]} -%> <% end -%> <%= select(:animal, :name, @number) %> </div>
- ここでobserve_fieldの登場!
<%= observe_field(:hoge_fuga_id, :frequency => 0.2, :update => "animal", :url => {:controoler => "animal", :action => "select"}, :with => "value") %>
-
- :hoge_fuga_id …監視されるselectのidを指定する。今回の場合はselectの第一引数と第二引数を『_』で繋げたものになる。railsでのselectの仕様らしい。※これはコードのHTMLを見てみると確認できる。
- :frequency…監視(更新)する頻度を設定している。:on => 'change'と指定すると、選択した瞬間に変更になる。
- update…更新される場所を指定している。今回はDOM idで指定した。
- url…呼び出されるアクションの指定。
- with…:with => "value" とすると、controllerでparams[:value]でselectのvalueが取得できる。
- 最後にcontrollerの作成
# animal_controller.rb def select case params[:value] when "cat" @animals = 50 #"cat"を選択したとき when "dog" @animals = 100 #"dog"を選択したとき when "horse" @animals = 200 #"horse"を選択したとき end render :partial => "animal" end
これで、初めのselectで"cat"を選んだとき、次のselectでは選択肢が1〜50になり、
"dog"を選択すると1〜100になり、"horse"を選択すると1〜200になる!
最後までお読み頂き、ありがとうございます。