Вложенные
Во-первых, если вы хотите сохранить их все в одном dropdown
, мы создали следующий помощник, который сделает это за вас:
#app/helpers/application_helper.rb
def nested_dropdown(items)
result = []
items.map do |item, sub_items|
result << [('- ' * item.depth) + item.name, item.id]
result += nested_dropdown(sub_items) unless sub_items.blank?
end
result
end
Это позволит вам позвонить:
<%= f.select(:category_ids, nested_dropdown(Category.all.arrange), prompt: "Category", selected: @category ) %>
Это даст вам возможность вызывать одиночное раскрывающееся меню, вложенное в соответствии с ассоциациями вашего происхождения.
--
Аякс
Если вы хотите иметь двойные раскрывающиеся списки, вам, вероятно, придется реализовать функцию ajax
, чтобы извлекать необходимые данные каждый раз, когда начальное раскрывающееся меню изменяется:
#config/routes.rb
resources :categories do
get :select_item
end
#app/assets/javascripts/application.js
$("#first_dropdown").on("change", function(){
$.ajax({
url: "categories/"+ $(this).val() + "/select_item",
dataType: "json",
success: function(data) {
//populate second dropdown
}
})
});
#app/controllers/categories_controller.rb
Class CategoriesController < ApplicationController
respond_to :json, only: :select_item
def select_item
category = @category.find params[:category_id]
respond_with category.children
end
end
person
Richard Peck
schedule
21.07.2014