2012-03-26 5 views
1

Я новичок в Ruby on Rails. Я начал работать над RoR 1 месяц назад. Моя проблема:Динамический поле выбора в Ruby on Rails

У меня есть одна таблица, называемая syscode, которая имеет Id, Name, Desc и Parent_id. Для родителя Parent_id = 0 и для childs у них есть parent_id в соответствии с идентификатором родителя.

У меня должно быть два окна выбора, в которых в первом поле выбора должны отображаться родители, а второй флажок выбора должен быть динамическим. I. При щелчке родителя в первом поле выбора он должен отображать соответствующие дочерние элементы во втором поле выбора. Мне удастся получить parent_id по щелчку параметров в первом поле выбора.

Код я попытался это:

Вид: selectnew.html.erb

<div id="dvSelectSyscodeForm"> 
    <%= form_for(@syscode) do |f| %> 
    <div class="field"> 
     <label for="syscode_fksyscodeparent">Parent</label> 
     <%= f.select :fksyscodeparent, Syscode.where("fksyscodeparent = '0'").map {|s| ["#{s.syscode}", s.id ]} %> 
    </div> 
    <div id="dvShowChild" style="display:none;"> 
     <div class="field"> 
     <label for="childSyscodes">Child</label> 
     <%= f.select :fksyscodeparent, Syscode.where("fksyscodeparent = '0'").map {|s| ["#{s.syscode}", s.id ]} %> 
     </div> 
    </div> 
    <script type="text/javascript"> 
     var scode = []; 
     function parentSelected() {   
     parent_id = $('#syscode_fksyscodeparent').val(); 
     alert(parent_id);   
     }  

     $(document).ready(function() { 
     parentSelected(); 
     $('#syscode_fksyscodeparent').change(parentSelected); 
     }); 

    </script> 
    <% end %> 
    </div> 
    <%= link_to 'Back', syscodes_path %> 

Контроллер: selectnew

def selectnew 
    @syscode = Syscode.new 
    respond_to do |format| 
    format.html # selectnew.html.erb 
    format.json { render json: @syscode } 
    end 
end 

Пожалуйста, помогите мне, ребята ... Спасибо заранее ... !!

ответ

0

Вам необходимо выполнить вызов Ajax в функции parentSelected. Возврат от этого вызова Ajax должен быть javascript, который заменяет содержимое «dvShowChild» новым содержимым html для текущего выбранного родителя.

В качестве альтернативы вы можете сделать вызов ajax, который выберет html, а затем в обратном вызове успеха замените значение html «dvShowChild» на html, возвращенный из вызова ajax.

+0

Спасибо за ответ .... Я хочу, чтобы мой первый выпадающий список всегда был родителем. При выборе родителя он должен отображать второе выпадающее меню с его дочерними элементами. – yrkapil

+0

Да, это именно то, что я имел в виду. когда вы выбираете что-то в первом селекторе, вы меняете содержимое второго селектора одним из способов, о которых я упоминал выше. Отправьте родительский идентификатор с помощью вызова ajax и используйте его при построении шаблона возврата javascript или html. – EasyPush

+0

Я не понимаю, как это сделать в рубине на рельсах ... Пожалуйста, помогите, разместив образец кода ... – yrkapil

0

Вы можете выполнить следующие шаги - Шаг -1 На ваш взгляд файла родительском окне выбора

= f.select :parent_id, @parent_val, data: { remote: true, url: update_children_url} 
child select box 

= f.select :child_id, @child_values.present? ? @child_values : [], {prompt: 'Select' } 

Шаг -2 создать update_children.js.erb файл в ваши взгляды папку и запишите следующий код -

$("#child_id").html("#{j options_for_select(@child_values)}") 

Шаг - 3 В контроллере

def update_children 
    return values @child_values 
end