2011-02-15 10 views
9

Quiero que mis casillas de verificación sean utilizables, así que generalmente agrego etiquetas para las casillas de verificación para que pueda seleccionar el texto en lugar de tener que "apuntar" a la casilla de verificación.label_tag and checkbox_tag problem en rieles

El problema es, ¿qué sucede si estoy usando un formulario de atributos anidados en los rieles? Tengo este código por ahora:

%ul 
    - test_category.test_cases.each do |test_case| 
    %li 
     = check_box_tag "job_test_cases[]", "#{test_case.id}", test_case.id 
     = label_tag "test_case_#{test_case.id}", test_case.name 

problema con esto es que se produce esto:

<li> 
    <input type="checkbox" value="70" name="job_test_cases[]" id="job_test_cases_" checked="checked"> 
    <label for="test_case_70">Blah blah</label> 
</li> 

mientras que yo quería que fuera así:

<li> 
    <input type="checkbox" value="70" name="test_case_id[]" id="test_case_70" checked="checked"> 
    <label for="test_case_70">Blah BLah blah/label> 
</li> 
+0

Su salida no es en absoluto lo que esperaba de cómo está utilizando 'check_box_tag': no parece/para que coincida con la documentación en absoluto http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag – raidfive

+0

estoy confundido -_- – corroded

+0

oh espera, creo que pegué lo incorrecto ... edítelo editándolo – corroded

Respuesta

0

Al hacer formas anidadas , necesita el fields_for para asegurarse de que sus campos tengan el nombre correcto (en lugar del each).

Sugeriría echar un vistazo a formtastic y cocoon: eso simplificará en gran medida la realización de formularios anidados.

[EDIT: hacerlo usted mismo]

No estoy seguro de que puedo corregir su código, porque haces algo extrañamente mal: no entiendo qué valor desea ser posiblemente comprobado ?? No lo envías. No podría ser el id. Por lo que normalmente se escribe algo como: Corrección de su código sólo sería:

check_box_tag "test_case[#{test_case.id}]", test_case.is_checked? 

donde el campo is_checked? devuelve algún tipo de valor booleano. Creo que ayudaría si me dieras un poco más de información sobre lo que estás tratando de hacer.

que generaría algo así como

<input type="checkbox" value="true" name="test_case[70]" id="test_case_70" checked="checked"> 

dado is_checked? volvería true.

Si desea nombrar explícitamente id y name diferente, tendrá que ajustar la forma explícita, al igual que

check_box_tag "test_case[#{test_case.id}]", test_case.is_checked?, test_case.is_checked?, :name => 'bla', :id => 'other_bla' 
+0

aunque me preocupan los nombres de los campos de formulario, sí necesito el ID para no tener ese arreglo, así que puedo hacer las etiquetas yo mismo. ¿Sabes cómo lo implementan si alguna vez? (Sé sobre formtastic) – corroded

+0

Intenté responder, pero necesito más información. No estoy seguro de lo que quiere decir: "hacer las etiquetas usted mismo". Con formtastic puede anular fácilmente los valores de las etiquetas. Si tiene más control sobre el html generado, echa un vistazo a simple_form. Pero en algunos casos también debes poder hacer todo a mano. – nathanvda

+0

Bueno, de hecho, el código fue hecho por mi colega y él necesita obtener una matriz de test_cases de los parámetros, por lo tanto, el ID es test_case [] y el valor es 71, 72, etc. si envía el formulario obtiene test_cases [] => {71, 72}. solo quiero que funcione de esa manera con las etiquetas, pero la identificación de la casilla de verificación lo arruina porque todas las casillas de verificación deben tener una identificación de test_case []. ¿Eso explica bien mi plan? – corroded

8

yo era capaz de igualar la casilla con la etiqueta de la siguiente manera:

En la casilla de verificación: Utilicé check_box_tag, especificando el nombre del elemento específico (función aquí) como el índice de la matriz para producir la identificación con un valor en ella.Pasé el: Nombre del valor hash para anular el nombre especificado en el check_box_tag, por lo que no tiene el id:

check_box_tag "user[roles][#{role.to_s}]", role.to_s, @user.has_role?(role), :name => "user[roles][]" 

que genera el código HTML siguiente:

<input id="user_roles_ROLE1" name="user[roles][]" type="checkbox" value="ROLE1" /> 

En la etiqueta, me especifique el ID de usar el nombre de la matriz + '_' más el nombre del elemento (papel aquí), para apuntar correctamente a la id en la etiqueta:

label_tag "user_roles_#{role}", cur_role.role_name, :class => 'span_after_label' 

que genera el código HTML siguiente:

<label class="span_after_label" for="user_roles_ROLE1">User</label> 

Cuando el PUT se envía al controlador, los params tienen los siguientes campos:

"user"=>{ ..., "roles"=>["ROLE1", "ROLE2", "ROLE3"], ... } 

que es el nombres de función para todas las funciones controladas.

Así, para el código, me gustaría probar el siguiente:

check_box_tag "test_case_id[#{test_case.id}]", "#{test_case.id}", test_case.id, :name => "test_case_id[]"