【问题标题】:How to use HTML ID in a ruby if statement condition如何在 ruby​​ if 语句条件中使用 HTML ID
【发布时间】:2019-05-03 16:37:52
【问题描述】:

我正在尝试根据选中的复选框呈现表单。我想在条件中使用带有复选框 id 的 if 语句,但 rails 抛出错误“未定义的方法 tab1.有没有办法在 if 语句中定位 html?谢谢

<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 %>

【问题讨论】:

  • 您需要使用 javascript 来更改您的 DOM。

标签: html ruby if-statement


【解决方案1】:

Rails 不知道您正在尝试引用 DOM 对象的 id 字段,因为这不是它正在寻找的东西。您收到该特定错误的原因是因为 ruby​​ 正在查看 tab1.checked? 并说“在我可以调用 checked? 之前,我需要获取 tab1 所以我可以在任何类型的对象上调用 checked? tab1 ...现在,我是否定义了一个名为 tab1 的变量或方法...没有?然后我将抛出一个错误,因为据我所知它是未定义的。基本上,考虑 HTML 元素 ID(在这种情况下)不是 Ruby 的工作。

如果你想从 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 从表单外的文本框中获取响应,拉取输入的值并将其设置为表单内的隐藏表单元素。但这可能超出了范围,所以我只是将您指向这篇文章...

This appears to be a good post on how to use hidden inputs

【讨论】:

  • 感谢您的回答。这种作品,但是在页面的第一次加载时,两种形式都显示,一个在彼此的顶部,因为我当时还没有点击标签。有没有办法解决这个问题?谢谢
  • 您可以使用相同的逻辑在页面加载时简单地隐藏其中一个元素。所以在var barQuestions = $('#bar_questions'); 的正下方添加barQuestions.hide();。这将在页面加载时运行而无需等待单击事件。值得注意的是,还有其他可以说是更好的方法来使用 CSS 和 rails 分配的类,但现在这应该可以解决问题。 :)
猜你喜欢
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2016-02-28
相关资源
最近更新 更多