2012-05-31 8 views
11

html: {class: "form-horizontal"} विकल्प के माध्यम से form_for के लिए एक वर्ग को जोड़ने डिफ़ॉल्ट new_model या edit_model वर्ग ओवरराइड करता है। मौजूदा form_helper क्लास को रखते हुए मैं अपनी कक्षा कैसे जोड़ूं?मैं कैसे एक वर्ग एक फार्म के लिए माणिक में रेल पर स्थापित करने/मौजूदा डिफ़ॉल्ट सहायक वर्ग अधिभावी बिना जोड़ सकता हूँ?

मैं चाहता हूँ:

<form class="edit_model form-horizontal"> या

<form class="new_model form-horizontal">

बजाय

:

<form class="form-horizontal">

उत्तर

0
html: {class: "edit_model form-horizontal"} 
+2

फॉर्म बिल्डर की सुंदरता यह है कि यह स्वचालित रूप से edit_model और new_model कक्षाओं के बीच स्विच करता है।मैं ऑब्जेक्ट को किसी कथन के अंदर रखने के बिना ऐसा करने का एक शानदार तरीका चाहूंगा जो यह पता लगाता है कि यह एक नई वस्तु है या नहीं। – Evan

1

शायद नहीं एक आदर्श समाधान है, लेकिन आप के साथ यह कर विचार किया है जे एस/JQuery?

उदाहरण के लिए:

$(document).ready(function(){ 
    $('form.edit_model').addClass('form-horizontal') 
}); 
6

मैं बिल्कुल वैसा ही मुद्दे में भाग गया। अंत में, मैं इस समाधान

form_for @foo, :html => {:class => "form-horizontal #{controller.action_name}_model_name"} 

के साथ आया था यह थोड़ा बहुत देर हो चुकी इतना उपयोग की आप के लिए हो सकता है, लेकिन शायद किसी और यह उपयोगी मिल जाएगा के लिए हो सकता है।

0

क्या आपने मर्ज विधि का उपयोग करने का प्रयास किया है? [http://ruby-doc.org/core-1.9.3/Hash.html#method-i-merge] कुछ एचटीएमएल = html.merge (नया) {तरह | कुंजी, मान 1, मान 2 | मान 1 + "" + मान 2} आप वर्ग मूल्य में नया मान फ़ीड दिया जाएगा। [त्वरित संपादित करें: कॉन्फ़िगर और कार्यान्वयन का परीक्षण करने के लिए सावधान ताकि आप पूरी तरह से एचटीएमएल के ऊपर लिख तो नहीं रखा गया)

0

आप वर्ग के नाम उत्पन्न करने के लिए form_for की तरह दृश्य सहायक dom_class(object, prefix = nil) उपयोग कर सकते हैं।

यह बहुत साफ रूप में सीधे यह कर नहीं है, लेकिन यह एक सहायक में शामिल बस टिकट हो सकता है। उदाहरण के लिए:

# app/helpers/application_helper.rb 
def class_for object, *additional_classes 
    additional_classes.unshift dom_class(object, object.persisted? ? 'edit' : 'new') 
end 

# app/views/models/_form.html.erb 
<%= form_for @model, :html => {:class => class_for(@model, 'form-horizontal')} do |f| %> 
    <%# ... %> 
<% end %> 

<form class="new_model form-horizontal" ...> 
1

:html => {:class => '...'} विकल्प के माध्यम से कक्षाओं को परिभाषित करना डिफ़ॉल्ट बिल्डर द्वारा जोड़े गए वर्गों ओवरराइड करता है। हालांकि, आप उन वर्गों को ओवरराइड किए बिना ब्लॉक के भीतर सीएसएस कक्षाएं जोड़ सकते हैं।

form_for सहायक के साथ, :class अन्यथा सेट नहीं होने पर एक स्ट्रिंग होगी। संलग्न करते समय अग्रणी स्थान पर ध्यान दें।

<%= form_for @model do |f| %> 
    <% f.options[:html][:class] << ' form-horizontal' %> 
    <%# ... %> 
<% end %> 

<form class="edit_model form-horizontal"> 

आप simple_form_for सहायक का उपयोग कर रहे हैं, तो options[:html][:class] एक सरणी हो जाएगा, और आप अतिरिक्त अग्रणी अंतरिक्ष की जरूरत नहीं है (हालांकि यह दर्द नहीं होगा)।

<%= simple_form_for @model do |f| %> 
    <% f.options[:html][:class] << 'form-horizontal' %> 
    <%# ... %> 
<% end %> 

<form class="simple_form edit_model form-horizontal"> 

आप एक मॉडल के बजाय एक प्रतीक का उपयोग कर रहे हैं, form_for वर्ग सेट नहीं होगा, और options[:html][:class] ब्लॉक में nil हो जाएगा। लेकिन अगर आप ऐसा कर रहे हैं तो आपके पास कोई नया मॉडल नहीं है या फिर भी बने रहें।

<%= form_for :model do |f| %> 
    <% f.options[:html][:class] << ' form-horizontal' %> 
    <%# ... %> 
<% end %> 

NoMethodError: undefined method `<<' for nil:NilClass 
संबंधित मुद्दे