Necesito tener varios botones de envío.
Tengo un formulario que crea una instancia de Contact_Call.
Un botón lo crea normalmente.
El otro botón lo crea, pero debe tener un valor de atributo diferente del predeterminado, y también debe establecer el atributo en un modelo diferente pero relacionado que se usa en el controlador.
¿Cómo puedo hacer eso? No puedo cambiar la ruta, así que ¿hay alguna manera de enviar una variable diferente que sea recogida por [: params]?
Y si lo hago, ¿qué hago en el controlador, configurar una declaración de caso?
ruby-on-rails
ruby
form-submit
Timothy T.
fuente
fuente
Respuestas:
Puede crear varios botones de envío y proporcionar un valor diferente a cada uno:
Esto dará como resultado:
Dentro de su controlador, el valor del botón enviado será identificado por el parámetro
commit
. Verifique el valor para hacer el procesamiento requerido:Sin embargo, recuerde que esto une estrechamente su vista al controlador, lo que puede no ser muy deseable.
fuente
También hay otro enfoque, utilizando el atributo de formación en el botón de envío:
El código se mantiene limpio, ya que el botón de creación estándar no necesita ningún cambio, solo inserta una ruta de enrutamiento para el botón especial:
fuente
Alternativamente, puede reconocer qué botón se presionó cambiando su nombre de atributo.
Es un poco incómodo porque debe verificar la presencia de las teclas params en lugar de simplemente verificar el
params[:commit]
valor: recibiráparams[:a_button]
oparams[:b_button]
dependiendo de cuál se presionó.fuente
Solución similar a la sugerida por @ vss123 sin usar gemas:
Tenga en cuenta que evito usar valor y uso el nombre de entrada en su lugar, ya que el valor del botón enviar a menudo se internacionaliza / traduce. Además, evitaría usar esto demasiado ya que saturará rápidamente su archivo de rutas.
fuente
Resolvimos usando restricciones avanzadas en rieles.
La idea es tener la misma ruta (y por lo tanto la misma ruta y acción nombradas) pero con restricciones de enrutamiento a diferentes acciones.
CommitParamRouting
es una clase simple que tiene un métodomatches?
que devuelve verdadero si el parámetro de confirmación coincide con el atributo de instancia dado. valor.Esto está disponible como una gema commit_param_matching .
fuente
Una vieja pregunta, pero como he estado lidiando con la misma situación, pensé en publicar mi solución. Estoy usando constantes de controlador para evitar introducir una discrepancia entre la lógica del controlador y el botón de visualización.
Y luego en la vista:
De esta manera, el texto solo vive en un lugar, como una constante en el controlador. Sin embargo, todavía no he intentado averiguar cómo solucionarlo.
fuente
Tengo un número variable de botones de envío en mi formulario gracias a nested_form_fields, por lo que usar el nombre no fue suficiente para mí. Terminé incluyendo un campo de entrada oculto en el formulario y usando Javascript para completarlo cuando se presionó uno de los botones de envío del formulario.
fuente