2012-08-03 19 views
5

Estoy tratando de combinar los botones de radio y text_field para un solo valor:Mezcla botones de radio y text_field

= f.radio_button :system, "bacteria" 
Bacteria 
= f.radio_button :system, "mammalian" 
Mammalian 
= f.radio_button :system, "yeast" 
Yeast 
= f.radio_button :system, "insect" 
Insect 
= f.radio_button :system, "other" 
Other: 
= f.text_field :system, class:"input-small" 

Cuando envío, no pasa nada porque un valor en blanco se da en params incluso si se comprueba una radio (Creo que considera el campo de texto).

Me trataron de dar otro nombre a la text_field, y se sustituye el: valor del sistema en el controlador después de actualizar, pero se ve como una manera sucia ...

¿Tiene alguna idea más limpias?

Respuesta

2

Aquí no puede mezclar directamente radio_button y text_field para el mismo campo. Creo que puede definir un campo adicional de radio_button que se ocultará y cuyo valor se actualizará cuando el usuario entre en text_field.

= f.radio_button :system, "bacteria" 
Bacteria 
= f.radio_button :system, "mammalian" 
Mammalian 
= f.radio_button :system, "yeast" 
Yeast 
= f.radio_button :system, "insect" 
Insect 
= f.radio_button :system, "other" 
Other: 
= f.radio_button :system, nil, :id => :hidden_radio, :style => "display:none" 
= f.text_field :free_system_input, class:"input-small", :id => :free_system_input 

En encima de usted escribirá onchange evento en text_field y siempre que el valor se introduce en el interior text_field esta forma se establece el valor de radio_button oculto a la text_field_value.

:javascript 
$("free_system_input").keyup(function(){ 
    $("hidden_radio").val($(this).val()) 
}) 

Por encima de código es sólo para dar idea de cómo tratar con el problema y no funcionará tal como es .. :)

2

Gracias a la ayuda de Sandip, he conseguido solucionar mi problema!

Aquí es la vista:

= f.radio_button :system, "bacteria" 
Bacteria 
= f.radio_button :system, "mammalian" 
Mammalian 
= f.radio_button :system, "yeast" 
Yeast 
= f.radio_button :system, "insect" 
Insect 
%br/ 
= f.radio_button :system, nil, id: 'other_system_radio', 
       checked: radio_checked?('system', f.object.system) 
Other: 
%input.input-small#other_system_text{ value: text_input?('system', f.object.system) } 

utilizo funciones de ayuda para gestionar formulario de edición (llenar el campo de texto si el valor si es diferente de los otros dados):

def radio_checked?(type,val) 
    case type 
    when 'system' 
     ['bacteria', 'mammalian', 'yeast', 'insect'].include?(val) ? '' : 'checked'    
    end 
    end 

def text_input?(type,val) 
    case type 
    when 'system' 
     ['bacteria', 'mammalian', 'yeast', 'insect'].include?(val) ? '' : val 
    end  
end 

Y un poco de Javascript para seleccionar el botón de opción "Otro" cuando el usuario se enfoca en el campo de texto:

@handle_other_field = -> 
    $('#other_system_text').focus(-> $('#other_system_radio').attr('checked','checked')) 
    $('#other_system_text').keyup(-> $('#other_system_radio').val($(this).val()))