2010-07-03 8 views
16

En mi aplicación, tengo una pequeña casilla que aparece en cada página, verificando el estado de las solicitudes realizadas por el usuario. Si se acepta una solicitud en cualquier momento, entonces el usuario debería ser llevado automáticamente a una página determinada. Este es mi código hasta ahora:¿Puedo usar redirect_to en una vista en RoR?

<% offersMade.each do |w| %> 
    <% if w.accepted == true %> 
    <% redirect_to offer_path(:email => "[email protected]") %> 
    <% end %> 
<% end %> 

Pero estoy consiguiendo este error:

undefined method `redirect_to' for #<ActionView::Base:0x1042a9770> 

¿No es posible redirect_to usuario en una vista? Si no, ¿hay algo más que pueda usar? Gracias por leer.

Respuesta

29

redirect_to es un método de ActionController :: Base Class por lo que no puede usarlo en ActionView.

Puede seguir los siguientes pasos

<% if w.accepted == true %> 
    <script type="text/javascript"> 
    window.location.href="/logins/sign_up" // put your correct path in a string here 
    </script> 
<% end %> 

Editado para el parámetro de correo electrónico

window.location.href="/logins/sign_up?email=<%= w.email %>" 

lo siento, no sé si hay algo en Ruby para eso.

+0

Gracias, esto funciona genial. ¿Sabes si hay una forma en que puedo usar una variable RoR en la construcción de url? En mi código original, arriba, tengo (: email => "[email protected]"), no estoy seguro si puedo hacer algo similar desde javascript. – ben

+0

verifique mi respuesta editada. – Salil

+0

¡Muchas gracias, funciona! No pensé que pudieras insertar Ruby en js, pero aparentemente puedes. ¡Gracias de nuevo! – ben

1

redirect_to no es un método de ActionView. Es un método de ActionController. Probablemente pueda usar Javascript window.location.href en la carga de la página o en algún otro evento para llevar a su usuario a otra página.

+1

Gracias por su ayuda, no sabía esto. – ben

6

El código en la vista podría moverse al controlador, lo que haría que redirect_to esté disponible.

class ApplicationController < ActionController::Base 
    before_action :check_for_accepted_offer 

    def check_for_accepted_offer 
    if Offer.any? { |o| o.accepted } 
     redirect_to offer_path(:email => "[email protected]") 
    end 
    end 
end 

Si el PO quería cambiar inmediatamente la URL cuando se acepta una oferta entonces ninguno de los código Ruby se muestra en las respuestas ayudaría, ya que sólo se evalúa cuando se carga la página. La OP tendría que configurar algún tipo de votación o empuje estrategia para alertar al navegador cuando una oferta ha sido aceptada y luego usar el redireccionamiento de JavaScript esquema publicado en otra respuesta:

window.location.href="/logins/sign_up?email=<%= w.email %>" 

Aunque, esto no responde a la pregunta : "¿Cómo puedo usar redirect_to en una vista?", Creo que esta respuesta finalmente habría sido más útil para el OP. Me encontré con alguien usando esta respuesta para redirigir a otra página, cuando la redirección debería haberse realizado en el controlador.

0

Sí, puede llamar al controller.redirect_to desde su vista para obtener lo que quiere sin tener que procesar toda la respuesta y luego usar javascript en el cliente para realizar una nueva solicitud.

En el ejemplo, este sería el resultado:

<% offersMade.each do |w| %> 
    <% if w.accepted == true %> 
    <% controller.redirect_to offer_path(:email => "[email protected]") %> 
    <% end %> 
<% end %> 

Tenga en cuenta que este controller.redirect_to no va a salir de su bucle, por lo que probablemente va a querer break, y probablemente querrá asegurarse de que el resto de su vista solo se representa condicionalmente si no redirigió.

(Descargo de responsabilidad: no apruebo necesariamente esta técnica. Será mejor que lo haga en su controlador o ayudante, como han mencionado otros.)

16

Si desea utilizar redirect_to de la vista, hacer este método:

sintaxis: <% ruta% controller.redirect_to>

Ejemplo: <% controller.redirect_to users_profile_path%>

+3

¡Esta es una gran manera de hacer esto de forma más nativa y evitar JavaScript! –

+0

Cuando usé esto, necesitaba la palabra 'controlador', no el nombre del controlador. Esto funcionó bien. –

Cuestiones relacionadas