2

私はプロジェクトに取り組み始め、私の前の人はHAMLを使用して2つの選択ボックスを表示し、最初の選択に基づいて2番目を更新しました。HAML を ERB に変換する方法がわからないので、HAML をパーシャルに入れただけです。最初の選択ボックスには正しい値が表示されますが、2 番目の選択ボックスには何も含まれていません。最初のボックスで 2 番目のボックスを正しい値で更新するにはどうすればよいですか? 最初のものには州が含まれ、2 番目には選択された州に基づくインストールが含まれることになっています。これが私のコードです:

検索ビュー:

<%= render 'state_installation_select' %>

HAML 部分:

= state_installation_select @states, @installation_options_by_state # ProgramsHelper

プログラムヘルパー:

def state_installation_select(states, installation_options_by_state)
    haml_tag(:div, class: 'field') do
      haml_concat(label_tag :state, "Please select your state")
      haml_concat(select_tag :state, options_for_select(states), include_blank: true, class: 'state state_installation_select')
    end

    haml_tag(:div, class: 'field') do
      haml_concat(label_tag :installation_id, "Please select your installation")
      haml_concat(select_tag :installation_id, nil, include_blank: true, class: 'installation state_installation_select')
    end
    content_for :domready, %(InstallationSelect.init(#{installation_options_by_state.to_json});).html_safe
  end

プログラム コントローラ:

def search_form_for_parents
    @installations = Installation.all
    @states = Installation.states
    @installations_by_state = @installations.group_by(&:state_code)
    @installation_options_by_state = @installations_by_state.each_with_object({}){ |(state,installations), h| h[state] = installations.map{|i| [i.name, i.id]} }
end

プログラム Javascript:

var InstallationSelect = {
  init: function(installations_for_state){

    $state_select = $('select.state.state_installation_select');

    $state_select.change(function(){
      var state = $(this).val();
      var installations = installations_for_state[state] || [];
      var $installation_select = $(this).parent().parent().find('select.installation.state_installation_select');

      $installation_select.html( InstallationSelect.options_for_select(installations) );
    }).triggerHandler('change');
  },

  options_for_select:function(container){
    var options = jQuery.map(container, function(c){
      return '<option value="' + c[1] + '">' + c[0] + '</option>';
    });

    return options;
  }

};
4

0 に答える 0