2011-03-15 13 views
11

Hace poco me encontré con este problema: Rails 3 link_to (:method => :delete) not workingRails 3 link_to generator for: post,: put, &: delete?

En el que fue confundido por qué mi link_to 'test', test_path(:test => test), :method => :post no estaba funcionando (¿por qué se estaba haciendo en lugar de la fijación). Como lo sugiere la publicación anterior, fue porque no tenía los archivos de Rails javascript, que maneja dinámicamente el formulario sobre la marcha para :post, :put & :delete.

No estoy seguro de que me guste especialmente de depender de Javascript para hacer esto por mí, ya que me gustaría que mi aplicación sea completamente funcional con JavaScript desactivado; es cómo me gusta desarrollarme (así sé que tengo toda la funcionalidad de programación de Rails funciona correctamente), y cuando conecto mi aplicación con javascript, no tengo que preocuparme por duplicar esta funcionalidad, ya que suelo borrar el archivo stock de javascripts generado por Rails.

Leí en alguna parte que, técnicamente, los hipervínculos (elementos de anclaje) solo deberían usarse realmente para las solicitudes GET, y que los botones (como parte de los elementos del formulario) deberían usarse para los otros métodos.

así, mis dos preguntas:

  1. ¿Existe una joya por ahí que se reescribir cualquier link_to ... :method => en mi opinión, a un elemento de la forma en la marcha cuando se vuelven mis puntos de vista?
  2. Si no, ¿cómo me engancharía en el analizador de vistas para escribir el mío? (Usando HAML, preferiblemente)

En esencia, lo que me gustaría es escribir esto en mi archivo HAML:

= link_to 'Test Link', some_path(:with => some_resource), :method => :post 

... y tener mi salida HTML representado salir con esto:

<form action="some_path?with=some_resource" method="post"> 
    <!-- insert appropriate _method hidden field here --> 
    <!-- add appropriate csrf token and whatnot --> 
    <button type="submit">Test Link</button> 
</form> 

... para que todos los ayudantes link_to con métodos definidos (por lo tanto, no afectará enlaces de civil cuyo verbo es GET) funciona sin javascript ?


También apreciaría cualquier pensamiento sobre la parte por qué de esta pregunta, específicamente por qué el equipo de rieles decidió mantener esta funcionalidad ligada a javascript en lugar de hacerlo a través de HTML puro?

Respuesta

22

Parece que realmente desea una forma de elemento único (en este caso, un botón). Si es así, desea que el ayudante button_to:

button_to 'Test Link', some_path(:with => some_resource), :method => :post

Esto generará un formulario con un elemento input[type=submit] dentro de ella.

Sin Javascript, no puede tener un hipervínculo que se enviará utilizando un verbo HTTP que no sea "GET".

Si necesita más estilo/el control de la forma que se queden por button_to, se puede hacer algo como esto:

module LinksHelper 
    def link_form(text, destination, options = {}) 
    form_tag(destination, :method => options.delete(:method)) do 
     <<-HTML 
     <!-- some HTML code here --> 
     <button type="submit">#{text}</button> 
     <!-- some more HTML code here --> 
     HTML 
    end 
    end 
end 
+0

Grande. Esto me da algo con lo que trabajar. ¡Gracias! – neezer

Cuestiones relacionadas