在 Ruby on Rails 中使用带有 If 语句的 Select Option 表单

Using Select Option forms with If statements in Ruby on Rails

本文关键字:语句 If Select 表单 Option on Ruby Rails      更新时间:2023-09-26

我的目标:创建一个表单,使用Ruby/Rails表单帮助程序为每个选择提供不同的值,并if/elsif语句来show|hide选项。(在块引号中设置工作JS代码)

我的问题:不确定如何使用带有if/elsif语句的 ruby/rails 中的选项选择值。 此信息将从用户输入到Post中。 (使用设计用户 GEM)

我如何设法让事情变得正常:创建了一个带有 JS 函数的引导表单以显示 |隐藏选项选择字段,具体取决于它们的选择方式。(下面我的_form.html.erb

在我的Ruby Rails版本底部的表单中,我是否缺少任何最初隐藏可选Hallway表单的内容?它是否以轨道格式正确构造?

请原谅我缺少 ruby rails 语法,因为我正在学习但找不到有关如何执行此类任务的资源,以show|hide选择带有if/elsif语句的表单。

感谢您未来的时间。

关于表单如何运作的说明:

第 1 步:选择年级

第 2 步:选择走廊

-如果走廊A, 显示走廊 A 的选项选择

-如果走廊B, 显示走廊 B 的选项选择

-如果走廊C, 显示走廊 C 的选项选择

我的_form.html.erb

  <div class="filter-third">
    <div class="styled-select styled-blue">
      <select id="post_gradelvl" name="post[gradelvl]">
        <option value="%">Select Grade Level</option>
        <option value="PS4">4</option>
        <option value="PS5">5</option>
      </select>
    </div>
  </div>
  <div class="filter-third">
    <div class="styled-select styled-blue">
      <select id="post_hallway" name="post[hallway]">
        <option value="%">Select Hallway</option>
        <option value="hallA">A</option>
        <option value="hallB">B</option>
        <option value="hallC">C</option>
      </select>
    </div>
  </div>
  <div class="filter-third"id="hallwayAFields" style="display: none;">
    <div class="styled-select styled-blue">
      <select id="post_hallAClasses" name="post[hallAClasses]">
        <option value="%">Select Available Classes</option>
        <option value="hallAclass1">English</option>
        <option value="hallAclass2">Spanish</option>
        <option value="hallAclass3">German</option>
      </select>
    </div>
  </div>
  <div class="filter-third"id="hallwayBFields" style="display: none;">
    <div class="styled-select styled-blue">
      <select id="post_hallBClasses" name="post[hallBClasses]">
        <option value="%">Select Available Classes</option>
        <option value="hallBclass1">Math</option>
        <option value="hallBclass2">Science</option>
        <option value="hallBclass3">Gym</option>
      </select>
    </div>
  </div>
  <div class="filter-third"id="hallwayCFields" style="display: none;">
    <div class="styled-select styled-blue">
      <select id="post_hallCClasses" name="post[hallCClasses]">
        <option value="%">Select Available Classes</option>
        <option value="hallCclass1">Art</option>
        <option value="hallCclass2">Extra Cred 1</option>
        <option value="hallCclass3">Extra Cred 2</option>
      </select>
    </div>
  </div>

我的JS为每个走廊选择一个show|hide选项:

<script>
  $("#post_hallway").change(
    function(){
      if ($("#post_hallway").val() == "hallA") {
        $("#hallwayAFields").show();
      } else {
        $("#hallwayAFields").hide();
      }
      if ($("#post_hallway").val() == "hallB") {
        $("#hallwayBFields").show();
      } else {
        $("#hallwayBFields").hide();
      }
      if ($("#post_hallway").val() == "hallC") {
        $("#hallwayCFields").show();
      } else {
        $("#hallwayCFields").hide();
      }
    }
  );
</script>

我对Ruby Rails表单版本的尝试是我的目标:

      <div class="option-select">
        <%= f.option-select :gradelvl %>
          <select id="post_gradelvl" name="post[gradelvl]">
            <option value="%">Select Grade Level</option>
            <option value="PS4">4</option>
            <option value="PS5">5</option>
          </select>
      </div>
      <div class="option-select">
        <%= f.option-select :hallway %>
          <select id="post_hallway" name="post[hallway]">
            <option value="%">Select Hallway</option>
            <option value="hallA">A</option>
            <option value="hallB">B</option>
            <option value="hallC">C</option>
          </select>
      </div>
  <% if :hallAClasses %>
      <div class="filter-third" id="hallwayAFields">
        <%= f.option-select : hallAClasses %>
          <select id="post_hallAClasses" name="post[hallAClasses]">
            <option value="%">Select Available Classes</option>
            <option value="hallAclass1">English</option>
            <option value="hallAclass2">Spanish</option>
            <option value="hallAclass3">German</option>
          </select>
      </div>
<% elsif :hallBClasses %>
      <div class="filter-third"id="hallwayBFields">
        <%= f.option-select : hallBClasses %>
          <select id="post_hallBClasses" name="post[hallBClasses]">
            <option value="%">Select Available Classes</option>
            <option value="hallBclass1">Math</option>
            <option value="hallBclass2">Science</option>
            <option value="hallBclass3">Gym</option>
          </select>
      </div>
<% else :hallCClasses %>
      <div class="filter-third"id="hallwayCFields">
        <%= f.option-select : hallCClasses %>
          <select id="post_hallCClasses" name="post[hallCClasses]">
            <option value="%">Select Available Classes</option>
            <option value="hallCclass1">Art</option>
            <option value="hallCclass2">Extra Cred 1</option>
            <option value="hallCclass3">Extra Cred 2</option>
          </select>
      </div>
<% end %>

除了 rails 视图中的语法问题之外,这里还有一个更基本的问题:视图模板生成一个"静态"HTML 页面,该页面仅包含加载页面时选择的走廊的选择选项。您的 JavaScript 将无法正常工作,因为没有其他内容可显示。

如果不在 JavaScript 中管理显示/隐藏,就无法做你想做的事。因此,您的轨道视图模板必须呈现所有走廊的select

最重要的是,如果用户正在编辑现有对象,则必须在页面加载后立即运行JavaScript,以隐藏需要立即隐藏的内容。更好的是,加载页面时,所有内容都应该隐藏,因此脚本将仅显示需要的内容。基本上是这样的:

updateVisibleClasses = function(){
  if ($("#post_hallway").val() == "hallA") {
    $("#hallwayAFields").show();
  } else {
    $("#hallwayAFields").hide();
  }
  if ($("#post_hallway").val() == "hallB") {
    $("#hallwayBFields").show();
  } else {
    $("#hallwayBFields").hide();
  }
  if ($("#post_hallway").val() == "hallC") {
    $("#hallwayCFields").show();
  } else {
    $("#hallwayCFields").hide();
  }
}
$(document).ready(updateVisibleClasses);
$("#post_hallway").change(updateVisibleClasses);

Rails 可以帮助您生成 select 语句,这些语句应该来自服务器,而不是在视图中进行硬编码。如果你有一个带有走廊属性的类模型,你可以像这样生成选择选项(这只是一个起点):

<%= form_for @name_of_your_model do |f| %>
  <!-- Take care of the grade level here -->
  <% @hallways.each do |hallway| %>
    <%= f.select 'hallway', 'class_id', Class.where(hallway_id: hallway.id).collect {|c| [ c.name, c.id ] }, { include_blank: true }) %>
  <% end %>
<% end %>

请查看选择表单帮助程序的文档。