2011-08-13 16 views
7

¿Cómo paso una url en form_for submit? Intento utilizar un formulario con cada botón apuntando a cada acción del controlador, uno es búsqueda y otro es crear. ¿Es posible tener 2 botones de envío con diferentes acciones en el mismo formulario?form_for con múltiples acciones de controlador para enviar

<%= form_for @people do |f| %> 
    <%= f.label :first_name %>: 
    <%= f.text_field :first_name %><br /> 

    <%= f.label :last_name %>: 
    <%= f.text_field :last_name %><br /> 

    <%= f.submit(:url => '/people/search') %> 
    <%= f.submit(:url => '/people/create') %> 
<% end %> 

Respuesta

20

No hay una forma simple de Rails de enviar un formulario a diferentes URL dependiendo del botón presionado. Puede usar javascript en cada botón para enviar a diferentes URL, pero la forma más común de manejar esta situación es permitir que el formulario se envíe a una URL y detectar qué botón se presionó en la acción del controlador.

Para el segundo enfoque con botones de envío de este tipo:

<%= form_for @people do |f| %> 
    # form fields here 
    <%= submit_tag "First Button", :name => 'first_button' %> 
    <%= submit_tag "Second Button", :name => 'second_button' %> 
<% end %> 

Su acción sería algo como esto:

def create 
    if params[:first_button] 
    # Do stuff for first button submit 
    elsif params[:second_button] 
    # Do stuff for second button submit 
    end 
end 

Ver this similar question para más información sobre ambos enfoques.

También, vea Railscast episode 38 en formularios de múltiples bytes.

+1

De acuerdo, mantenga las cosas simples, use el enfoque nativo, ** js ** puede administrar * url de acción *. Le sugiero que use otro formulario para buscar con CSS ajustado para cambiar la posición – Anatoly

2

Esta pregunta es muy similar a this one, aunque es un poco diferente

solo quería higlight que alguna respuesta a la pregunta aforementionned también sugirió añadir restricciones a las rutas, por lo que en realidad se puede enrutar las consultas a diferentes acciones de controlador!

Créditos al autor, vss123

Hemos resuelto mediante restricciones avanzadas en los carriles.

La idea es tener la misma ruta (y, por lo tanto, la misma ruta con nombre & acción) pero con restricciones de enrutamiento para diferentes acciones.

resources :plan do 
    post :save, constraints: CommitParamRouting.new("Propose"), action: :propose 
    post :save, constraints: CommitParamRouting.new("Finalize"), action: :finalize 
end 

CommitParamRouting es una clase simple que tiene un método partidos? que devuelve verdadero si el param de confirmación coincide con la instancia dada attr. valor.

Esto está disponible como una gema commit_param_matching.

+0

Tenga en cuenta que a diferencia de las respuestas basadas en JS que reemplazan el url de acción de formulario, este método se basa completamente en el servidor y funcionará incluso para clientes que tienen JavaScript deshabilitado –

Cuestiones relacionadas