Я пытаюсь создать приложение RoR с тремя моделями:
Вот мои основные модели отношений:
модели /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/, '') %>');
Я не уверен, что у меня есть это в нужном месте, хотя...
Что вам нужно:
Осмотрите со своей консолью веб-браузера свои варианты выбора и используйте селектор CSS для создания объекта jQuery для выбора сектора, например:
$('#sector_select')
Добавьте к этому объекту обработчик, поэтому при изменении запроса 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 в коде, вам нужно проверить, чтобы получить правильный селектор CSS. Убедитесь, что вы получаете ожидаемый ответ на вкладке "Сеть" вашего инспектора веб-браузера (если используете Chrome).
Вам нужен контроллер, который отвечает в /subsectors/for_select
, в файле app/controllers/subsectors_controller.rb
:
class SubsectorsController < ApplicationController
def for_select
@subsectors = Subsector.where sector_id: params[:sector_id]
end
end
Вам нужно представление, которое возвращает параметры для заполнения app/views/subsectors/for_select.html.erb
:
<% @subsectors.each do |ss| %>
<option value="<%= ss.id %>"><%= ss.name %></option>
<% end %>
Вам нужен маршрут:
get '/subsectors/for_select', to: 'subsectors#for_select'