2013-09-23 3 views
0

У меня есть два simple_form поля так:Рельсы формы: форма изменения поля из ранее выбранных полей

<%= f.input :ration_card ,as: :radio_buttons,collection: ["Yes","No"], input_html: {id: "rationcard"} %> 
<%= f.input :rationcardNum , label: "Ration Card No." ,input_html: {id: "rationcard_no"} %> 

Я хочу показать второе поле только тогда, когда пользователь выбирает «Да» для первого поля. Моего Jquery:

$(function(){ 
    $("#rationcard").change(function(){ 
     if ($("#rationcard").val()=="Yes"){ 
      $("#rationcard_no").show(); 
     } else { 
      $("#rationcard_no").hide(); 
     } 
    }) 
}) 

Я могу увидеть файл JS включается в голове страницы.

генерируется HTML:

<div class="control-group radio_buttons optional family_ration_card"> 
<label class="radio_buttons optional control-label" for="rationcard">Ration card</label> 
    <div class="controls"> 
    <label class="radio"> 
    <input id="rationcard" class="radio_buttons optional" type="radio" value="Yes" name="family[ration_card]" checked="checked"> 
Yes 
    </label> 
    <label class="radio"> 
    <input id="rationcard" class="radio_buttons optional" type="radio" value="No" name="family[ration_card]"> 
No 
    </label> 
</div> 
</div> 

<div class="control-group string optional family_rationcardNum"> 
<label class="string optional control-label" for="rationcard_no">Ration Card No.</label> 
    <div class="controls"> 
    <input id="rationcard_no" class="string optional" type="text" value="DGFR12" size="50" name="family[rationcardNum]"> 
    </div> 
</div> 

Но динамические поля не работают. Что здесь не так?

Или предложите лучший способ достичь этого.

+0

форма загружена с помощью Ajax? –

+0

Уверены ли ошибки в файле 'js' перед объявлением этой функции jQuery? Я бы поставил «предупреждение», чтобы увидеть, всплывает ли он, чтобы убедиться, что он выполняется. Также проверьте «источник страницы просмотра», чтобы убедиться, что он выглядит правильно. – lurker

+0

Не ставить это как ответ, потому что я не совсем уверен, но если я правильно помню, «значение» этого флажка не изменится, когда вы нажмете на него (попробуйте посмотреть его через веб-отладчик и посмотреть, изменится ли он когда вы нажмете его). Однако если вы делаете '$ (" # rationcard "). Prop (" checked ")' (возвращает логическое значение), которое будет меняться каждый раз (опять же, тест в веб-отладчике). – MrDanA

ответ

1

Прежде всего, вы не можете разместить идентификатор на входах, потому что в итоге вы получите два входа с одинаковыми параметрами, и jQuery найдет только первый. Во-вторых, вам нужно использовать $ (this) внутри вашего обработчика.

Вам нужно STH в строке:

<%= f.input :ration_card ,as: :radio_buttons,collection: ["Yes","No"], wrapper_html: {id: "rationcard"} %> 
<%= f.input :rationcardNum , label: "Ration Card No." ,wrapper_html: {id: "rationcard_no"} %> 

$(function(){ 
    var toggle_rationcardNum = function(visible) { 
     if (visible){ 
      $("#rationcard_no").show(); 
     } else { 
      $("#rationcard_no").hide(); 
     } 
    } 

    $("#rationcard input").change(function(){ 
     toggle_rationcardNum($(this).val()=="Yes") 
    }) 

    toggle_rationcardNum($("#rationcard input:checked").val()=="Yes") 
})(); 
+0

Thant работает нормально, но он только скрывает входные данные второго поля, а не метки. Добавлен wrapper_html для обоих полей. Также я хотел бы узнать, что это за 'wrapper_html' **? – mrudult

+2

input_html - все html-параметры, которые будут помещаться на входы, wrapper_html - это опция html на wrapper-div, в которую помещаются эти входы. – BroiSatse

+0

Ну, это не работает для флажков. :(Также он не применяется автоматически при загрузке страницы. Работает только при нажатии вручную – mrudult

Смежные вопросы