2012-04-23 15 views
29

निम्नलिखित check_box_tag के साथ:अनचेक किए जाने पर 'गलत' या '0' पैरामीटर पोस्ट करने के लिए मैं check_box_tag कैसे बना सकता हूं?

<%= check_box_tag 'object[boolean_attribute]', 1, object.boolean_attribute %> 

मैं केवल एक दिशा में boolean_attribute अद्यतन कर सकते हैं: असत्य से सत्य में।

डिफ़ॉल्ट रूप से अनचेक किया जाता है (क्योंकि object.boolean_attribute गलत है) और मैं इसे जांचता हूं और फिर फॉर्म सबमिट करता हूं, a: boolean_attribute => 1 पैरामीटर पोस्ट किया जाता है।

लेकिन, जब मैं सच से गलत से अद्यतन करने का प्रयास करता हूं तो कोई भी पारित नहीं होता है, इसलिए boolean_attribute सत्य रहता है।

दूसरे शब्दों में, जब (क्योंकि object.boolean_attribute सच है) डिफ़ॉल्ट रूप से चेक किया गया है और मैं इसे अचयनित और उसके बाद फार्म, एक सबमिट करें: boolean_attribute => 0 नहीं तैनात है।

मैं यह चेक_बॉक्स_टैग कैसे पोस्ट कर सकता हूं: boolean_attribute => 0 पैरामीटर अनचेक किए जाने पर? http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag

धन्यवाद:

एपीआई मैं समझ नहीं से अगर कोई इसे आसानी से प्राप्त करने के लिए पारित करने के लिए कुछ विकल्प है।

संपादित

किसी कारण मैं नहीं जान सकता (एक नेस्ट कई-से-अनेक संघ के साथ) अपने वास्तविक कोड में, hidden_field_tag ​​काम नहीं कर रहा है।

<%= hidden_field_tag 'order[preparations_attributes][][cooked]', nil %> 
<%= check_box_tag 'order[preparations_attributes][][cooked]', '1', preparation.cooked? %> 

अब मैं विपरीत समस्या है: मैं चेकबॉक्स का चयन रद्द कर सकते हैं और तैयारी aspected के रूप में अद्यतन किया जाता है, लेकिन अगर मैं चेकबॉक्स को चेक यह पैरामीटर को खराब करता।

Parameters: {"utf8"=>"✓", "authenticity_token"=>"bGgPGbk+Cuk2q+LEgqetmk4e7xie8dB3iMP9Cj3SUm0=", "order"=>{"customer_name"=>"Duccio Armenise", "duedate"=>"2012-04-25 09:24:00.000000", "preparations_attributes"=>[{"quantity"=>"1", "description"=>"custom recipe", "kind"=>"custom", "cooked"=>"", "recipe_id"=>"9", "id"=>"86", "quantities_attributes"=>[{"ingredient_id"=>"", "qty"=>"", "_destroy"=>"0"}, {"ingredient_id"=>"11", "qty"=>"5.0", "id"=>"193", "_destroy"=>"0"}], "_destroy"=>"0"}], "add_preparation"=>{"recipe_id"=>""}}, "continue"=>"Confirm", "id"=>"31"} 

अब देखते हैं कि क्या एक मेस जब मैं चेकबॉक्स को चेक, से शुरू "पकाया" => "" किसी कारण रेल के लिए preparation_attributes बंद हो रहा है:

यहाँ अनियंत्रित बॉक्स के लिए तैनात पैरामीटर हैं हैश बहुत जल्दी!

Parameters: {"utf8"=>"✓", "authenticity_token"=>"bGgPGbk+Cuk2q+LEgqetmk4e7xie8dB3iMP9Cj3SUm0=", "order"=>{"customer_name"=>"Duccio Armenise", "duedate"=>"2012-04-25 09:24:00.000000", "preparations_attributes"=>[{"quantity"=>"1", "description"=>"custom recipe", "kind"=>"custom", "cooked"=>""}, {"cooked"=>"1", "recipe_id"=>"9", "id"=>"86", "quantities_attributes"=>[{"ingredient_id"=>"", "qty"=>"", "_destroy"=>"0"}, {"ingredient_id"=>"11", "qty"=>"5.0", "id"=>"193", "_destroy"=>"0"}], "_destroy"=>"0"}], "add_preparation"=>{"recipe_id"=>""}}, "continue"=>"Confirm", "id"=>"31"} 

संपादित करें # 2:

मुझे लगता है कि मैं गहरी नेस्टेड संसाधन रूपों और परम गुजर से संबंधित एक रेल बग में भाग: एक select_tag के साथ काम करने https://github.com/rails/rails/issues/5937

अब मैं इसे बनाया के लिए :

<%= select_tag 'order[preparations_attributes][][cooked]', options_for_select({yes: 1, no: 0}, preparation.cooked? ? 1 : 0) %> 

मुझे लगता है कि आदेश "hidden_field पकड़ लिया" से बचने के लिए एक select_tag का उपयोग करने जा एक एक है स्वीकार्य कामकाज।

वैसे भी, उत्तर के लिए धन्यवाद!

उत्तर

43

check_box (w/ओ _tag) सहायक आप के लिए आपकी समस्या का समाधान करने के लिए क्षेत्र छिपा जोड़ता है:

= form_for @product, url: '' do |f| 
    %p 
    = f.label :title 
    = f.text_field :title 

    = f.fields_for :line_items do |li| 
    = li.check_box :approved 
    = li.label :approved, li.object.id 
    %br 
    = f.submit 

: नेस्टेड संसाधनों (line_items उत्पाद accepts_nested_attributes_for) के साथ काम:

<%= check_box 'object', 'boolean_attribute', {}, 'true', 'false' %> 

# result: 
<input name="object[boolean_attribute]" type="hidden" value="false" /> 
<input id="object_boolean_attribute" name="object[boolean_attribute]" type="checkbox" value="true" /> 

युपीडी 3 में से 2 चेकबॉक्स की जांच करने से मुझे params देता है:

{..., "उत्पाद" => {"शीर्षक" => "आरओआर पुस्तक", "line_items_attributes" => {"0" => {"अनुमोदित" => "0", "आईडी" => "47 "}," 1 "=> {" अनुमोदित "=>" 1 "," आईडी "=>" 48 "}," 2 "=> {" अनुमोदित "=>" 1 "," आईडी "=>" 51 "}}}," प्रतिबद्ध "=>" अद्यतन उत्पाद "," कार्रवाई "=>" action1 "," पठनीयता के लिए नियंत्रक "=>" परीक्षण "}

params YAML के रूप में:

product: 
    title: RoR book 
    line_items_attributes: 
    '0': 
     approved: '0' 
     id: '47' 
    '1': 
     approved: '1' 
     id: '48' 
    '2': 
     approved: '1' 
     id: '51' 

देखें? कोई छुपा फ़ील्ड नहीं लेकिन चेक/अनचेक किए गए राज्य स्पष्ट रूप से प्रतिष्ठित हैं।

@product.update_attributes params[:product] 

मुझे आशा है कि यह मदद करता है:

इस params होने मुझे संबद्ध line_items अद्यतन करने के लिए कोड की एक पंक्ति का उपयोग करने की अनुमति देता है।

+0

धन्यवाद लेकिन मैं check_box_tag समाधान के बाद था क्योंकि मेरे वास्तविक कोड में मैं एक नेस्टेड संसाधन अपडेट कर रहा हूं। संपादन में मेरा वास्तविक कोड देखें। क्या आप समाधान घोंसला संसाधन फ़ॉर्म पर भी लागू होते हैं? – Darme

+0

हाँ, यह उपयुक्त है! कुछ भी आपको 'ऑब्जेक्ट' की बजाय 'ऑर्डर [preparations_attributes] [] [पकाया]' 'जैसे कुछ पास करने से रोकता है। – jdoe

+0

अभी के लिए मैंने एक select_tag समाधान (EDIT # 2 देखें) पर एक वर्कअराउंड स्विचिंग की है, लेकिन मैं आपके सुझाव का भी परीक्षण करने जा रहा हूं ... – Darme

25

आप चेकबॉक्स ऊपर एक छिपी हुई फ़ील्ड इस्तेमाल कर सकते हैं: इस तरह

<%= hidden_field_tag 'object[boolean_attribute]', nil %> 

, भले ही आपके चेकबॉक्स चेक नहीं किया है, तो आप अभी भी nil प्रस्तुत कर देंगे। क्या वह काम तुम्हारे लिये होगा?

+1

और अधिक सुविधाजनक दृष्टिकोण है। मेरा जवाब देखें – jdoe

+0

अच्छा, मुझे यह पसंद है। –

+0

धन्यवाद, मुझे यह दृष्टिकोण पता था, मैं कुछ और के बाद हूं क्योंकि मेरे असली ऐप में किसी कारण से यह काम नहीं कर रहा है (मेरे पास कई सारे मॉडल हैं ...)। मैं अपने वास्तविक कोड के साथ प्रश्न अपडेट कर रहा हूं ... – Darme

0

चेक बॉक्स जैसी सरणी के लिए, आप भी एक हैश इस्तेमाल कर सकते हैं:

= hidden_field_tag "ad_ids[#{ad.token}]" , false 
= check_box_tag "ad_ids[#{ad.token}]" , true, true 
4

अगर कोई स्तंभ प्रकार बूलियन और check_box_tag का उपयोग कर तो इसे देखो। यह मेरे लिए काम किया। <%= hidden_field_tag 'order[preparations_attributes][][cooked]', 'false' %> <%= check_box_tag 'order[preparations_attributes][][cooked]', true, preparation.cooked? %>

1

मेरे रेल ऐप में मुझे सच्चे और झूठे के आसपास एकल उद्धरण जोड़ने की आवश्यकता थी।

मूल कोड

<%= f.check_box :admin, {}, true, false %> 

अपडेट किया गया कोड

<%= f.check_box :admin, {}, 'true', 'false' %> 

मुझे आशा है कि किसी और मदद करता है!