Не могу найти ошибку в моем зависимом выпадающем списке выбора на Active Admin (Rails 3.2, Active Admin 1.0)

0

Я пытаюсь создать приложение RoR с тремя моделями:

  • Игры, которые можно классифицировать в секторе (называемом GameSector) и в подсекторе (называемом GameSubsector)
  • Сектор состоит из многих подсекторов.
  • Подсектором.

Вот мои основные модели отношений:

модели /game.rb

belongs_to :game_sector,    :foreign_key => 'game_sector_id',   :counter_cache => true
belongs_to :game_subsector, :foreign_key => 'game_subsector_id',:counter_cache => true

Я использую Active Admin для ввода информации о играх, секторах или подсекторах.

У меня есть очень простая форма, когда я создаю игру, и я бы просто хотел, чтобы второй выбор выпадал (game_subsector) настраивался на выбор первого выбора (игрового устройства), так что я не весь (очень длинный ) list_subsectors, но только те, которые принадлежат выбранному игровому_сектору.

После того, как десятки тестов и приемов попытались, но не удалось, я, наконец, использовал этот совет, который оказался для меня соответствующим: http://samuelmullen.com/2011/02/dynamic-dropdowns-with-rails-jquery-and-ajax/,

Но это все еще не работает.

Вот форма в Active Admin, которая находится на admin/game.rb

ActiveAdmin.register Game do

  menu :parent => "Campaigns", :priority => 1

  controller do 
    with_role :admin_user      

      def game_subsectors_by_game_sector
      if params[:id].present?
        @game_subsectors = GameSector.find(params[:id]).game_subsectors
      else
        @game_subsectors = []
      end

      respond_to do |format|
        format.js
      end
    end

  end


form do |f|

    f.inputs "Details" do
      f.input :name
      f.input :game_sector_id,
        :label => "Select industry:",
        :as => :select, :collection => GameSector.all(:order => :name),
        :input_html => { :rel => "/game_sectors/game_subsectors_by_game_sector" }
      f.input :game_subsector_id, :as => :select, :collection => GameSubsector.all(:order => :name)

f.actions
  end

Я чувствую, что javascript даже, возможно, не уволен.

Используемый jquery находится на app/assets/javascript/admin/active_admin.js (я изменил конфигурацию, чтобы загрузить этот javascript при загрузке активных страниц администрирования)

jQuery.ajaxSetup({
  'beforeSend': function(xhr) { xhr.setRequestHeader("Accept", "text/javascript"); }
});

$.fn.subSelectWithAjax = function() {
  var that = this;

  this.change(function() {
    $.post(that.attr('rel'), {id: that.val()}, null, "script");
  });
};

$("#game_game_sector_id").subSelectWithAjax(); //it it found in my view???

Наконец, я создал представление, как этот эксперт советовал: в приложении /views/layout/game_subsectors_by_game_sector.js.erb

$("#game_game_subsector_id").html('<%= options_for_select(@game_subsectors.map {|sc| [sc.name, sc.id]}).gsub(/n/, '') %>');

Я не уверен, что у меня есть это в нужном месте, хотя...

Теги:
activeadmin
ruby-on-rails-3

1 ответ

1
Лучший ответ

Что вам нужно:

  1. Осмотрите со своей консолью веб-браузера свои варианты выбора и используйте селектор CSS для создания объекта jQuery для выбора сектора, например:

    $('#sector_select')
    
  2. Добавьте к этому объекту обработчик, поэтому при изменении запроса AJAX уволен:

    $('#sector_select').change(function(){
      $.ajax('/subsectors/for_select', {sector_id: $(this).val()})
        .done(function(response){ // 3. populate subsector select
          $('#subsector_select').html(response);
        });
    });
    
  3. См. 3 в коде, вам нужно проверить, чтобы получить правильный селектор CSS. Убедитесь, что вы получаете ожидаемый ответ на вкладке "Сеть" вашего инспектора веб-браузера (если используете Chrome).

  4. Вам нужен контроллер, который отвечает в /subsectors/for_select, в файле app/controllers/subsectors_controller.rb:

    class SubsectorsController  < ApplicationController
      def for_select
        @subsectors = Subsector.where sector_id: params[:sector_id]
      end
    end
    
  5. Вам нужно представление, которое возвращает параметры для заполнения app/views/subsectors/for_select.html.erb:

    <% @subsectors.each do |ss| %>
      <option value="<%= ss.id %>"><%= ss.name %></option>
    <% end %>
    
  6. Вам нужен маршрут:

    get '/subsectors/for_select', to: 'subsectors#for_select'
    
  • 0
    Я проверю это сегодня вечером большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню