2012-08-16 205 views
0

是否有任何可用的輔助方法顯示/隱藏基於模型屬性值的指定div?根據屬性值顯示/隱藏div(複選框值)

這裏是我想要顯示包含openid_domain_name文本字段的部分,如果openid_enabledtrue,並且在編輯記錄時另外隱藏。

<%= form_for @application do |f| %> 
    <%= render "shared/error_messages", target: @application %> 
    <p> 
     <%= f.label :name %> 
     <%= f.text_field :name %> 
    </p> 
    <p> 
     <%= f.label :description %> 
     <%= f.text_field :description %> 
    </p> 
    <p> 
     <%= f.check_box :openid_enabled %> 
     <%= f.label 'openid', 'OpenID' %> 
     <div id="application_openid_domain" style="display: none;"> 
     <%= f.label :openid_domain_name %> 
     <%= f.text_field :openid_domain_name %> 
     </div> 
    </p> 
    <p><%= f.submit class: "btn btn-primary" %></p> 
<% end %> 

這是當用戶選中/取消選中複選框時顯示/隱藏div的javascript。

<script type="text/javascript"> 
    $(function() { 
     $(':checkbox').click(function() { 
      if ($(this).is(':checked')) 
      $("#application_openid_domain").show(); 
      else 
      $("#application_openid_domain").hide();    
     }); 
    }); 
</script> 

EDITED 生成的HTML源代碼:

<form accept-charset="UTF-8" action="/applications" class="new_application" id="new_application" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="Cq2rYF1qkjnsobimMTAUvle9Hi82LwdvghcVWRtC/I0=" /></div> 
    <p> 
    <label for="application_name">Name</label> 
    <input id="application_name" name="application[name]" size="30" type="text" /> 
    </p> 
    <p> 
    <label for="application_description">Description</label> 
    <input id="application_description" name="application[description]" size="30" type="text" /> 
    </p> 
    <p> 
    <input name="application[openid_enabled]" type="hidden" value="0" /><input id="application_openid_enabled" name="application[openid_enabled]" type="checkbox" value="1" /> 
    <label for="application_openid">OpenID</label> 
    <div id="application_openid_domain" style="display: none;"> 
     <label for="application_openid_domain_name">Openid domain name</label> 
     <input id="application_openid_domain_name" name="application[openid_domain_name]" size="30" type="text" /> 
    </div> 
    </p> 
    <p><input class="btn btn-primary" name="commit" type="submit" value="Create Application" /></p> 
</form> 

<script type="text/javascript"> 
    $(function() { 
     $(':checkbox').click(function() { 
      if ($(this).is(':checked')) 
      $("#application_openid_domain").show(); 
      else 
      $("#application_openid_domain").hide();    
     }); 
    }); 
</script> 
+0

我能請你發佈渲染(或被瀏覽器看到的呈現的HTML樣本)服務器端腳本與您的問題完全無關,只是爲了回答更困難。 – 2012-08-16 12:01:56

+0

在問題 – 2012-08-16 12:10:09

+0

中增加了生成的HTML這是你想要的嗎? http://jsfiddle.net/charlesjourdan/hK2dJ/ – 2012-08-16 12:20:54

回答

0

我已經寫了自定義的助手做同樣的。請建議,如果它是正確的解決方案或不。

應用程序/幫手/ application_helper.rb

def show_hide(show) 
    show ? 'block' : 'none' 
end 

應用程序/視圖/應用/ _form.html.erb

<div id="application_openid_domain" style="display: <%= show_hide(@application.openid_enabled?)%>;"> 
    <%= f.label :openid_domain_name %> 
    <%= f.text_field :openid_domain_name %> 
</div> 
3

可以使用jQuery.toggle()功能。

HTML:

​<div id="div">123</div> 
<input type="checkbox" vlalue="show-hide" checked="checked" id="box"> 

的JavaScript:

$('#box').change(function() { 
    $('#div').toggle(this.checked); 
}); 

DEMO

+0

這看起來更優雅,但我想在rails服務器返回html之前顯示hide div。 – 2012-08-16 12:29:26

+1

如果客戶端可以執行任何邏輯並且它是安全的,那麼最好在那裏執行卸載服務器(節省內存,處理時間和有時網絡帶寬等資源)。這個概念是10個客戶端中的每一個都可以爲自己做安全的1x工作,而不是讓服務器執行10x工作(對於10個客戶端中的每一個)。這就是爲什麼我們可以在後期看到如此多的客戶端MVC框架。 – 2012-09-21 22:21:03