RoR:加载编辑页面时根据用户选择显示/隐藏字段?

Posted

技术标签:

【中文标题】RoR:加载编辑页面时根据用户选择显示/隐藏字段?【英文标题】:RoR: Showing/hiding fields based on user selection when loading edit page? 【发布时间】:2021-08-02 23:29:57 【问题描述】:

我有一个下拉列表,用户在其中进行选择,然后显示部分中的相应字段供他们完成。

我的表单域

    <%= f.simple_fields_for :security do |security| %>
      <%= security.label :security_type %>
      <%= security.select :property_type, Security.property_types.keys, , class: 'project-dropdown- 
      width', id: "security" %>
                         
      <div id="property-fields">
        <%= render partial: "project_steps/security_partials/property", security: @security, locals:  security: security  %> 
      </div>
                                 
      <div id="other-fields" style="display: none;">
        <%= render partial: "project_steps/security_partials/land", security: @security, locals:  security: security  %>
      </div>
    <% end %>

应用程序.js

document.addEventListener('turbolinks:load', () => 
  const element = document.getElementById('security');
    if (element) 
      $('#security').change((e) => 
        if (e.target.value == 'other') 
          $('#property-fields').eq(0).hide();
          $('#other-fields').eq(0).fadeIn();
        
        else 
          $('#property-fields').eq(0).fadeIn();
          $('#other-fields').eq(0).hide();
          
     );
   
);

这适用于根据用户在表单中单击的选项显示和隐藏必填字段。但是,当用户保存、前进,然后再次返回页面(进行编辑)时,所选选项是正确的,但如果他们在此示例中选择了“其他”,则字段不是正确的。它会改为显示“属性”字段。

如果用户返回页面进行编辑,我如何才能根据用户选择的选项显示正确的字段?

ty

【问题讨论】:

您只在更改事件上运行逻辑,所以在用户更改任何内容之前没有什么会导致此逻辑运行,对吧?你需要让它在更改和初始加载时都运行 【参考方案1】:

下面的代码 sn-p 您的解决方案示例。请尝试执行该操作,如果有任何不妥之处,请在评论中告诉我。

当您从选择下拉菜单中更改选项时,它将在选择器$("#security") 上调用.change 事件。

同样的方式,你可以通过这行 jQuery 代码$("#security").val()获得当前选定值的值

所以您只需要编辑页面上的预选值,您将拥有基于该值的字段。

// document.addEventListener('turbolinks:load', () => 
//   const element = document.getElementById('security');
//   if (element) 

      $('#security').change((e) => 
        showFields(e.target.value)
      );

      showFields($('#security').val());

      function showFields(val) 
        if (val == 'other') 
          $('#property-fields').eq(0).hide();
          $('#other-fields').eq(0).fadeIn();
        
        else 
          $('#property-fields').eq(0).fadeIn();
          $('#other-fields').eq(0).hide();
          
      

//   
// );
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="security">
  <option value="propertis">Properties</option>
  <option value="other" selected>other</option>
</select>
<div id="property-fields">
   These are property-fields
</div>                      
<div id="other-fields" style="display: none;">
   These are other-fields
</div>

【讨论】:

以上是关于RoR:加载编辑页面时根据用户选择显示/隐藏字段?的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个字段中的选择显示/隐藏 django 管理表单字段

如何在页面加载之前隐藏 HTML 元素

如何在页面加载时隐藏所有表单字段并在从下拉列表中选择时启用

drupal:表单 API,根据输入动态隐藏或显示字段

Javascript 隐藏/显示部分在重置时不起作用

ReactJs:根据选择值显示或隐藏输入字段