2017-01-17 11 views
0

Мне нужно в своем приложении, чтобы выбрать из списка поставщика провайдера, а затем через ajax я могу видеть ниже список категорий, принадлежащих определенному провайдеру. У меня есть форма в activeadmin:Ajax call on a <select> в форматной форме

<%= semantic_form_for [:admin, @game], builder: ActiveAdmin::FormBuilder do |f| %> 
    <%= f.semantic_errors :state %> 
    <%= f.inputs do %> 
     <%= f.input :categorization_id, label: 'Provider', as: :select, 
        collection: Provider.all.map { |provider| ["#{provider.name}", provider.id] }, 
        input_html: { class: (:provider_select), 'data-url': category_select_path(provider: 4) } %> 
     <%= f.input :categorization_id, label: 'Category',input_html: { class: ('category_dropdown') }, as: :select, 
        collection: Category.all.map { |category| ["#{category.name}", category.id]}%> 
     ... 

    <% end %> 
    <%= f.actions %> 
<% end %> 

В контроллере activeadmin у меня есть:

controller do 
    def ajax_call 
     @provider = Provider.find(params[:provider]) 
     @categories = @provider.categories 
     respond_to do |format| 
     format.json { render json: @categories } 
     end 
    end 
end 

JS:

$(document).on('ready page:load', function() { 

    $('.select.input.optional').last().addClass('hidden_row'); 

    $('#game_categorization_id').change(function() { 
    var id_value = this.value; 
    $('.hidden_row').removeClass('hidden_row'); 
    $.ajax({ 
     type: 'GET', 
     url: '/admin/games/category_select' 
     // data: id_value 
    }) 
    }); 

}); 

и маршруты: match '/admin/games/category_select' => 'admin/games#ajax_call', via: :get, as: 'category_select'

У меня нет идея, как я могу передать идентификатор провайдера из коллекции в url. В настоящее время у меня там category_select_path(provider: 4), но на самом деле это должно быть что-то. например, category_select_path(provider: provider.id) В браузере на вкладке Network devtools я могу видеть мой category_select, но есть ошибка: Couldn't find Game with 'id'=category_select. Я не могу понять, откуда он. Какие-либо предложения? Благодарю.

ответ

0

Проблема была в маршрутах: match '/admin/games/category_select' => 'admin/games#ajax_call', via: :get, as: 'category_select'. Он зарезервирован действием контроллера Activeadmin. Так что я изменил свои маршруты на: get '/admin/select_category' => 'admin/games#get_providers_categories', as: 'select_category', и добавил к ajax вызова data: {provider: provider}, так что я мог стрелять в Params идентификатор поставщика:

$.ajax({ 
     type: 'GET', 
     url: '/admin/select_category', 
     data: { 
     provider: provider 
     }, 
     success: (function (data) { 
      $('#select_category').children('option').remove(); 
      $('#select_category').prepend('<option value=""></option>'); 
      $.each(data.categories, function() { 
      $('#select_category').append('<option value="' + this.id + '">' + this.name + '</option>') 
      }) 
     }) 
    })