Динамический выбор с родословной

Мое приложение, использующее драгоценный камень предков.

class Location < ActiveRecord::Base
 has_ancestry :cache_depth => true
 has_many :posts
end

class User < ActiveRecord::Base
 belongs_to :location
end

Я создал случайную локацию,

  • Аляска
  • California
    • Los Angeles
    • Fresno
      • Cincotta (Fresno)
      • Хаммонд (Фресно)
      • Мелвин (Фресно)

Мой вопрос, если пользователь зарегистрируется в форме, если пользователь выберет Калифорнию, отобразит дочерний элемент Лос-Анджелес и Фресно, после выбора Фресно отобразит его дочерний элемент.

У меня есть учебник по javascript для выпадающего списка http://www.plus2net.com/javascript_tutorial/dropdown-list-demo.php

Как можно работать с гемом предков?


person Mary Smith    schedule 20.07.2014    source источник


Ответы (2)


Вложенные

Во-первых, если вы хотите сохранить их все в одном 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
comment
Спасибо @RichPeck, мне нужно два поля выбора. Это пример plus2net.com /javascript_tutorial/dropdown-list-demo.php - person Mary Smith; 22.07.2014
comment
я создаю элемент списка с помощью github.com/doabit/ancestry_selectbox_demo, но не могу найти plus2net.com/javascript_tutorial/dropdown-list-demo.php - person Mary Smith; 23.07.2014
comment
Давайте посмотрим - извините за поздний ответ! - person Richard Peck; 23.07.2014
comment
я пытался сделать так, но это не работает, ‹%= f.collection_select(:category_id, Category.all.at_depth(1), :id, :name) %› ‹%= f.collection_select(:category_id, Category .all.at_depth(2), :id, :name) %› ‹%= f.collection_select(:category_id, Category.all.at_depth(3), :id, :name) %› - person Mary Smith; 23.07.2014
comment
Я следовал решению @RichardPeck, которое отлично работает, но редактирование или новое не сохраняется в базе данных, или, может быть, я что-то упустил в сильных параметрах. Любая помощь, пожалуйста? - person Charlie; 24.01.2018

Я не мог понять ваш вопрос, но попробуйте следовать этому руководству:

http://railscasts.com/episodes/262-trees-with-ancestry

Я смотрел его однажды, когда мне нужно было работать с драгоценным камнем предков.

Надеюсь, это поможет вам.

person jlucasps    schedule 20.07.2014
comment
Да, я узнаю из Railscasts, как установить драгоценный камень предков. В этом руководстве я не могу найти решение. - person Mary Smith; 21.07.2014