Raíles no campo de texto editable


82

Tengo un formulario_for escrito de la siguiente manera:

<div class="field">
    <%= location.label :city %>
    <%= location.text_field :city, :disabled=>true%>
</div>
<div class="field">
    <%= location.label :country %>
    <%= location.text_field :country, :disabled=>true%>
</div>

Como puede ver, los 2 campos de texto están deshabilitados porque se rellenan automáticamente con una función jquery y no quiero que el usuario los maneje. El problema es que de esta forma, la vista no pasa esos parámetros al controlador porque están deshabilitados !!! ¿Hay alguna otra forma de pasar un campo de texto no editable al controlador, teniendo cuidado de no usar un campo oculto porque quiero mostrar los resultados al usuario dentro de un cuadro de texto?

TNX


¿No habilita los campos con jquery antes del envío?
apneadiving el

Lo estoy haciendo ... ¿no sabes si hay una forma más limpia de hacerlo?
Joe

Respuestas:


196

¡Haz que sea de solo lectura!

<%= location.text_field :country,:readonly => true%>

9
Acerta con esto. La especificación W3 para formularios distingue disabledy read-onlydeja en claro que las entradas deshabilitadas no deben enviarse con los datos del formulario.
Robin Fisher

1
¡Gracias! Probablemente habría pasado otra media hora averiguando por qué :disabled => trueno estaba enviando mi campo.
Tom Harrison

3
Pero, ¿qué pasa si quiero que este campo sea accesible en Createacción?
Clon

1
Pero con este método cualquiera puede editar antes de enviar. ¿No es esto vulnerable?
mecyborg

1
Sí, esto es vulnerable. El usuario puede utilizar su navegador "Herramientas de desarrollo" (presione F12) para eliminar el readonly="readonly"atributo de la inputetiqueta y editar el campo de texto como desee. Si realmente necesita que esto sea seguro, elimine el campo de entrada por completo o valide la entrada del formulario en el modelo. De todos modos, esa fue una respuesta muy útil.
BrunoFacca

1

El truco consiste en utilizar "objeto" junto con una etiqueta para cualquier cosa que no desee cambiar. Así es como debe codificarlo:

<%= location.label(:country, f.object.country) %>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.