我正在尝试根据已选中的复选框来呈现表单。我想在条件中使用带有复选框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 %>
答案 0 :(得分:2)
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从表单外部的文本框中获取响应,提取输入的值并将其设置为表单内的隐藏表单元素。但这可能超出了范围,所以我只为您指出这篇文章...