div показать/скрыть UJS, запомнить состояние, когда форма содержит ошибки и происходит рендеринг (действие: : новый)

Использование form_for для построения модели «Человек для людей». Вот UJS, чтобы показать и скрыть div при щелчке флажка.

люди.js

  window.onload = function() {
    $('#is_student_chkbx').click(function() {
      return $('#student_properties').toggle();
    });
    return true;
  };

созданная страница люди/новые

...
<input id="is_student_chkbx" name="person[role_attributes][is_student]" type="checkbox" value="true" />

<div id='student_properties' style='display:none;'>
  <p>Test text</p>
</div>
...

people_controller.rb

class PeopleController < ApplicationController
  def new
    @person = Person.new
    @person.build_role
  end

  def create
    @person = Person.new(params[:person])
    ...
    @person.save ? redirect_to(person_path(@person)) : render(action: :new)
  end
end

Но существует проблема. Когда форма содержит ошибки (например, «Имя не может быть пустым» из-за проверки в модели), возникает render(action: :new), но 'student_properties' div не отображается, даже если установлен флажок 'is_student_chkbx'. Поэтому, когда я снова нажимаю 'is_student_chkbx' -> флажок не установлен, но появляется 'student_properties' div.

Итак, как запомнить состояние этого div?

Я пытался добавить if ($('#is_student_chkbx').is(':checked')) {$('#student_properties').show();} к window.onload, но этого не произошло render(action: :new)


person mpugach    schedule 16.08.2012    source источник


Ответы (2)


Чтобы заставить его работать, я использовал (спасибо rb512, который обратил мое внимание):

<div id='student_properties' style='display:<%= @person.role.is_student ? 'block' : 'none' %>;'>

Вместо:

<div id='student_properties' style='display:none;'>

Но лучше всего использовать класс CSS:

.hidden {
  display:none;
}

Тогда целевая строка будет выглядеть так:

<div class='your_other_class <%= 'hidden' unless @person.role.is_student %>' id='student_properties'>
person mpugach    schedule 23.08.2012

В новом действии добавьте следующее:
Обновление: пропущены кавычки
@person.role.is_student = false || params['is_student_chkbx']

person rb512    schedule 17.08.2012
comment
В этом нет необходимости - вложенная форма работает корректно. is_student_chkbx создан с использованием fields_for, поэтому name="person[role_attributes][is_student]" - person mpugach; 23.08.2012