2013-08-12 23 views
5

我有一个模型文档它具有属性上下文。 Kind是一个用作枚举的整数(使用优秀的active_enum宝石)。上下文仅适用于种类为“2”的文档,即如果文档是除2之外的任何种类,则上下文将为空。Rails:有条件地显示/隐藏表单域的最佳方法?

所以在表单页面创建一个新的文件,我有一个<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 %> 

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

到目前为止,这么好。但在编辑页的文件,我不希望上下文textarea到总是隐藏在初始页面加载,因为我们可能会编辑一个文件的种类。因此,如果我们正在编辑类型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:选项?

或者我是否在意这个?

回答

10

使用此:

<%= 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}" %> 

感谢

+0

没有内联样式请... – nXqd

+2

我同意内联样式是一个可怕的想法99%的时间,但我认为“显示:没有;”对于将要隐藏并使用Javascript显示的元素可能是一个例外。 – GMA

0

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

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

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