Rails 简单的表单输入显示/隐藏

Posted

技术标签:

【中文标题】Rails 简单的表单输入显示/隐藏【英文标题】:Rails simple form input show/hide 【发布时间】:2020-06-14 21:55:00 【问题描述】:

我使用ancestry gem 来创建类别和子类别(父、子、兄弟)。然后我在一个简单的表单中有一个选择输入:

<div class="form-group">
  <%= f.input :parent_category_id, collection: @categories, label: "Category", as: :grouped_select, group_method: :children, include_blank: true, input_html:  id: 'first-dropdown'  %>
</div>

我用父类别填充上述输入:

@categories = Category.where(ancestry: nil)

当我在上面的输入中选择一个类别时,子类别会出现在下面的输入中。如果类别没有子类别,则输入为空。

<div class="form-group">
  <%= f.input :category_id, label: "Subcategories", :collection => [], :label_method => :name, :value_method => :id, required: true, input_html:  multiple: true, id: 'second-dropdown'  %>
</div>

$('#first-dropdown').on('change', function() 
    $.ajax(
        url: 'categories/select_item?category_id=' + $(this).val(),
        dataType: 'json',
        success: function(data) 
            let childElement = $('#second-dropdown');
            childElement.html('');
            data.forEach(function(v) 
                let id = v.id;
                let name = v.name;
                childElement.append('<option value="' + id + '">' + name + '</option>');
            );
        
    );
);

这个设置一切正常。但现在我想添加一个我不知道如何添加的功能。我希望最初隐藏第二个输入。如果子类别存在,我想显示第二个输入,如果子类别不存在,我想隐藏第二个输入。任何想法如何实现这一点?

【问题讨论】:

【参考方案1】:

这可以工作...

    success: function(data) 
        let childElement = $('#second-dropdown');             
        childElement.toggle(Array.isArray(data) && data.length > 0)
        ...

【讨论】:

感谢@Andre Figueiredo 的回复。您提供的代码会根据是否存在子类别隐藏并显示输入。但是它会弄乱子类别,它会从选定的类别中添加新的类别,并保留旧的类别。我还希望最初隐藏输入字段,当我选择一个包含子类别的类别时。 我知道你的代码怎么样,但你可以用class: hidden初始化second-dropdown,并用append替换子元素,但这很奇怪,因为你已经用.html('')清理它了。 .

以上是关于Rails 简单的表单输入显示/隐藏的主要内容,如果未能解决你的问题,请参考以下文章

带有 JQuery 的 Rails 5:带有显示和隐藏 JQuery 切换的表单最初会显示,但在我刷新页面后会隐藏起来

如何在 Rails 中执行 AJAX-y 条件显示/隐藏表单字段?

Rails 4 真实性令牌 - 在标题和表单隐藏输入中?

Rails 5.1 button_to helper生成查询字符串而不是隐藏表单

Rails 表单,如何使用 jquery 设置隐藏字段的值

在编辑表单上隐藏 Rails 4 上 jquery.timepicker 的空日期值