1

PLease help , I used some examples to build dynamic select, but it does not seem to work , nevertheless in console I can see 200 status, I am not fluent so please please help, The problem is that list in the select will not decrease, it shows same options after choosing previos

index.html.erb

  <%= collection_select(nil, :site_id,  @sites,  :id, :name, {:prompt   => "Select a Site"}, { :id => "sites_select"}) %>
                            <br/>
                    <%= collection_select(nil, :floor_id, @floors, :id, :name, {:prompt   => "Select a Floor"}, {:id => "floors_select"}) %>
                    <br/>
                    <%= collection_select(nil, :pod_id, @pods, :id, :name, {:prompt   => "Select a pod"}, {:id => "pods_select"}) %>
                    <script>
                          $(document).ready(function() {
                            $('#sites_select').change(function() {
                              $.ajax({
                                url: "<%= update_floors_path %>",
                                data: {
                                  site_id : $('#sites_select').val()
                                },
                                dataType: "script"
                              });
                            });
                            $('#floors_select').change(function() {
                              $.ajax({
                                url: "<%= update_pods_path %>",
                                data: {
                                  floor_id : $('#floors_select').val()
                                },
                                dataType: "script"
                              });
                            });
                          });
                        </script>

devices_controller.rb

  def update_floors
# updates floors and pods based on genre selected
site = Site.find(params[:site_id])
# map to name and id for use in our options_for_select
@floors = site.floors.map{|a| [a.name, a.id]}.insert(0, "Select a Floor")
@pods   = site.pods.map{|s| [s.name, s.id]}.insert(0, "Select a Pod")

end

def update_pods
# updates pods based on floor selected
floor = Floor.find(params[:floor_id])
@pods =floor.pods.map{|s| [s.name, s.id]}.insert(0, "Select a Pod")
end

update_floors.js.erb

$('#floors_select').html("<%= escape_javascript(options_for_select(@floors)) %>");
$('#pods_select').html("<%= escape_javascript(options_for_select(@pods)) %>");

update_pods.js.erb $('#pods_select').html("<%= escape_javascript(options_for_select(@pods)) %>");

routes.rb

  get 'devices/update_floors', :as => 'update_floors'
      get 'devices/update_pods', :as => 'update_pods'
      root :to => "devices#index"

Appreciate any suggestion Thank you, D

4

3 に答える 3

1

問題はコントローラーにあり、

コードのどこにも Respond_to js ブロックについて言及していませんが、

このコードを両方の更新メソッドに入れるだけで、

respond_to do |format|
 format.js
end 
于 2012-12-12T07:39:40.260 に答える
1

新しくロードされた JavaScript が親ページに効果を追加していないようです。Ajax 成功コールバック内で $().html を実行しないでください。そして、update.js.html ページに select のオプションのみが含まれるようにします。動作するはずです。

JavaScript:

$("#sites_select").change(function(){
    $.ajax({
      url: your_url,
      //orther options ...
      success: function(data){
          $("#floors_select").html(data);
      }
    });

});

そしてあなたの update_floors.js.html で

<%=options_for_select(@floors)%>

更新ポッドについても同じことを行います。:)

于 2012-12-12T07:45:21.660 に答える
0

コントローラーで応答形式を指定します。respond_to :js, :only=>[:update_floors,:update_pods ]
それとは別に、次をupdate_floors.js.erbファイルに書き込みます。

$('#floors_select').html("<%= escape_javascript(collection_select(:your_object_name, :floor_id, @floors.to_a, :id, :name, :prompt=>"Select a Floor")) %>");
上記でうまくいくと思います。

于 2012-12-12T07:48:22.940 に答える