Как использовать HTML ID в рубине, если условие оператора - PullRequest
1 голос
/ 03 мая 2019

Я пытаюсь отобразить форму в зависимости от того, какой флажок был отмечен. Я хочу использовать оператор if с идентификатором флажка в условии, но rails выдает ошибку 'неопределенный метод tab1. Есть ли способ нацелить html в операторе if? спасибо

<input id="tab1" type="radio" name="tabs" checked>
  <label class="label-header" for="tab1"> UK Address</label>

  <input id="tab2" type="radio" name="tabs">
  <label class="label-header"for="tab2"> International Address </label>

  <!-- <section id="content1"> -->
  	<% if tab1.checked? %>
	  	<%= f.simple_fields_for :address do |fields| %>
  			<section id="content1">
	    		<%= render "address/fields", fields: fields, addressable: addressable %>
	    	</section>
	  	<% end %>
	  <% else %>
	  	<%= f.simple_fields_for :address do |fields| %>
  			<section id="content2">
	    		<%= render "address/international_fields", fields: fields, addressable: addressable %>
	    	</section>
	  	<% end %>
  	<% end %>

1 Ответ

2 голосов
/ 03 мая 2019

Rails не знает, что вы пытаетесь ссылаться на поле id объектов DOM, потому что это не то, что он ищет. Причина, по которой вы получаете эту конкретную ошибку, заключается в том, что ruby ​​смотрит на tab1.checked? и говорит: «прежде чем я смогу вызвать checked?, мне нужно захватить tab1, чтобы я мог вызвать checked? для любого типа объекта tab1». ... Теперь у меня есть переменная или определенный метод с именем tab1 ... Нет? Тогда я собираюсь выбросить ошибку, потому что, насколько я знаю, она не определена ". По сути, в Ruby не стоит думать об идентификаторах HTML-элементов (в данном контексте).

Если вы хотите получить информацию из DOM, вам следует использовать Javascript. Здесь есть разделение проблем, чтобы понять их. Думайте об этом, как будто вы говорите Rails, что нужно рендерить все, когда загружается представление, а затем условно отображать и скрывать разделы, используя события Javascript.

вот пример:

<input type='checkbox' id='foo' checked>
<label for='foo'>Foo Questions</label>

<input type='checkbox' id='bar'>
<label for='bar'>Bar Questions</label>

<%= form_for :my_model do |f| %>
   <%= f.input :foo_questions %>
   <%= f.input :bar_questions %>
   <%= f.submit 'submit me' %>
<%= end %>

А потом в вашем связанном файле Javascript что-то вроде ...

$(document).ready(function() {
   var fooQuestions = $('#foo_questions');
   var barQuestions = $('#bar_questions');

   $('#foo').on('click', function() {
      fooQuestions.show();
      barQuestions.hide();
   });

   $('#bar').on('click', function() {
      fooQuestions.hide();
      barQuestions.show();
   });

});

Имейте в виду, что даже если вы скроете один из своих вопросов, значение этого скрытого поля формы все равно будет отправлено вместе с формой. Если вы пытаетесь представить разные наборы данных, есть большая вероятность, что вы пытаетесь сделать слишком много с одной моделью. Или, если вы действительно хотите, чтобы это работало, вы можете использовать Javascript для получения ответов из текстовых полей за пределами формы, извлеките введенное значение и установите для него скрытый элемент формы внутри формы. Но это может быть за рамками, поэтому я просто укажу вам на эту статью ...

Это хороший пост о том, как использовать скрытые данные

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...