2012-04-23 13 views
29

: yanlıştan true: Sadece bir yönde boolean_attribute güncelleyebilirsiniz İşaretlenmediğinde 'false' veya '0' parametresini göndermek için check_box_tag öğesini nasıl yapabilirim? Aşağıdaki check_box_tag ile

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

.

Varsayılan olarak işaretlenmediğinde (object.boolean_attribute false olduğundan) ve bunu kontrol edip formu gönderin, a: boolean_attribute => 1 parametresi gönderilir.

Ancak, true'dan false'ye geçiş yapmaya çalışmadığımda, hiçbir param aktarılmadan boolean_attribute doğru kalır. (Object.boolean_attribute doğrudur çünkü) varsayılan olarak işaretli ve bunu işaretini kaldırın ve sonra formu, bir gönderme zaman başka deyişle

: boolean_attribute => 0 yayınlanmıştır değil olduğunu.

Bu check_box_tag dosyasını nasıl kaydedebilirim: boolean_attribute => işaretlenmediğinde 0 parametresi? http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag

teşekkür ederiz: Ben çözemiyorum API itibaren

kolayca ulaşmak için geçmesi gereken bazı seçenek varsa.

hidden_field_tag ​​çalışmıyor (yuvalanmış birçok çoğa dernek ile) benim gerçek kodda ben anlayamaz nedense için DÜZENLEME

. Ben onay kutusunun işaretini kaldırın ve hazırlık açı olarak güncellenir ama onay kutusunu işaretleyin eğer params haberci yukarıya:

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

Şimdi tersi bir sorun var.

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

Şimdi =>"", nedense Raylar için preparation_attributes kapatıyor ben itibaren, onay kutusunu kontrol ederken "pişmiş" ne dağınıklık bkz: Burada

kontrolsüz kutusu için yayınlanan parametreler şunlardır hash çok erken!

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

DÜZENLEME 2.:

ben derin iç içe kaynak formları ve param geçişle ilişkili bir Raylar hata koştu düşünüyorum: Bir select_tag çalışmak için ben yaptım Şimdilik https://github.com/rails/rails/issues/5937

:

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

ben "hidden_field gotcha" önlemek için bir select_tag geçiş yapan bir bir olduğunu düşünüyorum kabul edilebilir geçici çözüm.

Neyse, cevaplar için teşekkürler!

cevap

43

check_box yardımcı sizin için sorunu çözmek için alan gizli ekler (/ o _tag w):

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

UPD: iç içe kaynakları (Ürün accepts_nested_attributes_for: line_items) ile başa çıkmak

= 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 

3 onay kutusunun 2'sini kontrol etmek bana params'u şu şekilde verir:

{..., "product" => {"title" => "RoR book", "line_items_attributes" => {"0" => {"approved" => "0", "id" => "47 "}," 1 "=> {" onaylandı "=>" 1 "," id "=>" 48 "}," 2 "=> {" onaylandı "=>" 1 "," id "=>" 51

product: 
    title: RoR book 
    line_items_attributes: 
    '0': 
     approved: '0' 
     id: '47' 
    '1': 
     approved: '1' 
     id: '48' 
    '2': 
     approved: '1' 
     id: '51' 
: "}}}, ""=>" Güncelleme ürünü", "eylem"=> "action1 okunabilmesi için YAML olarak", "denetleyici"=> "test"}

params taahhüt

Görmek? Gizli alanlar yok, ancak kontrol edilen/işaretlenmemiş durumlar açıkça ayırt edilir.

@product.update_attributes params[:product] 

Ben yardımcı olur umarım: Bu params Having

beni ilişkili line_items güncellemek için bir satır kodun kullanmasını sağlar.

+0

Teşekkür ederim ama bir check_box_tag çözümünün peşindeyim çünkü gerçek kodumda iç içe geçmiş bir kaynağı güncelliyorum. Düzenlemede gerçek koduma bakın. İç içe geçmiş kaynak formuna da uygulanabilir bir çözüm mü? – Darme

+0

Evet, uygun! Hiçbir şey, '' object' yerine '' [preparations_attributes] [] [pişmiş] '' gibi bir şeyden geçmenizi engelleyemez. – jdoe

+0

Şimdilik bir select_tag çözümüne geçiş yaparken bir geçici çözüm yaptım (bkz. EDIT # 2), ancak önerinizi de test edeceğim ... – Darme

25

Sen Onay kutusunun üzerinde gizli bir alan kullanabilirsiniz:

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

Bu şekilde, sizin onay kutusu işaretli olmasa bile, yine de nil gönderilen alırsınız. Bu senin işine yarar mıydı?

+1

Daha uygun bir yaklaşım var. Cevabımı gör. – jdoe

+0

Güzel, hoşuma gitti. –

+0

Teşekkürler, bu yaklaşımı biliyordum, başka bir şey peşindeyim çünkü benim gerçek uygulamasındaki bir nedenden dolayı bu çalışmıyor (bazı modellere çok iç içe geçmiştim ...). Soruyu gerçek kodumla güncelliyorum ... – Darme

0

onay kutularını gibi diziye için, siz de bir karma kullanabilirsiniz:

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

kimse kolon tipi boolean ve kullanma check_box_tag varsa o zaman şuna bakın. Benim için çalıştı. <%= hidden_field_tag 'order[preparations_attributes][][cooked]', 'false' %> <%= check_box_tag 'order[preparations_attributes][][cooked]', true, preparation.cooked? %>

1

Raylarım uygulamasında, doğru ve yanlış etrafında tek tırnaklar eklemem gerekiyordu.

Orijinal kod

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

Güncelleme Kod

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

O başkası yardımcı olur umarım!