Rails:有条件地显示/隐藏表单字段的最佳方式?

时间:2013-08-12 08:20:08

标签: ruby-on-rails forms

我的模型文档,其属性种类上下文。 Kind是一个整数,用作枚举(使用优秀的active_enum gem)。上下文仅适用于类型为'2'的文档,即如果文档是2以外的任何类型, context 将为空白。

因此,在表单页面中创建一个新文档,我有一个<select>来选择类型,一个textarea用于上下文,最初是隐藏的:

<%= form_for @document do |f| %>

  ...  

  <%= f.text_area :context, placeholder: 'Context', style: 'display:none' %>

  <%= f.select :kind, Document.active_enum_for(:kind).to_select %>

  ...

<% end %>

使用jQuery的show()和hide()方法显示和隐藏textarea,该函数绑定到下拉列表中的change()事件。

到目前为止,这么好。但是在文档的编辑页面上,我不希望上下文textarea 总是隐藏在初始页面加载上,因为我们可能正在编辑一个类型的文档 2 即可。因此,如果我们正在编辑类型2的文档,我希望最初显示textarea,但在其他情况下隐藏。

这就是我现在所拥有的:

<% if @document.kind == 2 %>
  <%= f.text_area :context, placeholder: 'Context' %>
<% else %>
  <%= f.text_area :context, placeholder: 'Context', style: 'display:none' %>
<% end %>

有没有更好的方法呢?这对我来说有点冗长和多余;有没有办法只能打电话f.text_area并有条件地包含style:选项?

或者我是否想过这个?

2 个答案:

答案 0 :(得分:11)

使用此:

  <%= f.text_area :context, placeholder: 'Context', style: "#{'display:none' if @document.kind == 2}" %>

或者你可以为此添加一个css类,

display-none{
  display:none;
}

<%= f.text_area :context, placeholder: 'Context', class: "#{'display-none' if @document.kind == 2}" %>

由于

答案 1 :(得分:1)

或者你可以试试javascript?这是一种减少重复代码的方法,如果你有许多字段要隐藏,这种方式有一些优点。

<%= f.text_area :context, placeholder: 'Context' %>

<script type="text/javascript">
    $(function(){
        if ($('#document_kind').val() != '2')
            $('#document_context').hide();
    });
</script>