Forum: Rails-ES Metodo login y request_uri

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Jose Antonio P. (Guest)
on 2009-01-22 11:46
 Hola lista,

 Para el tema de sesiones y login tengo lo siguiente. En application.rb:

 def authorize
  unless User.find_by_id(session[:user_id])
   uri = request.request_uri
   reset_session
   session[:original_uri] = request.request_uri

   if(User.count == 0)

  flash[:notice] = "Por favor, introduzca el primer usuario en el
sistema"

   else

  flash[:notice] = "Por favor, identifiquese"

   end

   redirect_to(:controller => :users, :action => :login, :uri_aux =>
uri)

  end

 end

 En el redirect, el parametro que le paso (uri_aux) es porque hago un
reset a las sesiones en los login. Por lo tanto no me sirve de nada
pasarlo por el objeto sesiones porque se va a destruir luego.

 En el login hago lo siguiente:

 def login
  session[:current_date] = Date.today
  @current_date = session[:current_date]
  session[:user_id] = nil
  @uri = params[:uri_aux]
  # Si no hay usuarios en el sistema, crea un usuario
  if request.post?
   reset_session
   user = User.authenticate(params[:name], params[:password])
   if user
     session[:user_id] = user.id
     session[:current_project_id] =
                 user.user_projects.collect{|x|Project.find(x.project_id)}.first
     redirect_to( @uri || {:controller => "users", :action => "index" })
     return
   else
     flash[:error] = "Usuario y/o password incorrectos.\n
   <a href = ../forgot_password>¿Olvidó su contraseña?</a>"
   end
  end
  render(:layout => false)
 end

 El problema lo tengo en que cuando intento entrar por primera vez en el
sistema, por ejemplo "localhost/projects/1", me redirecciona siempre a
"localhost/users/index". La variable @uri en el redirect_to parece estar
a nil, cuando si pruebo en la vista su contenido, me muestra
"/projects/1".
 Otra prueba que he hecho es poniendo:
  redirect_to ("/projects/1" || {:controller => "....}), y me
redirecciona a "projects/1".

 ¿A qué puede ser debido el hecho de que no coja la variable @uri en el
redirect_to? ¡¡Gracias y perdon por el toston!!
Fernando G. (Guest)
on 2009-01-22 19:59
(Received via mailing list)
El día 22 de enero de 2009 10:46, Jose Antonio P.
<removed_email_address@domain.invalid>
escribió:
>  unless User.find_by_id(session[:user_id])
>   uri = request.request_uri
>   reset_session
>   session[:original_uri] = request.request_uri

Me hago un lío con el código porque no se ve bien en el cliente de
correo pero por probar puedes probar eto:

  uri = request.request_uri
  reset_session
  session[:original_uri] = uri

No sé :/

f.
Francesc E. (Guest)
on 2009-01-22 20:13
(Received via mailing list)
2009/1/22 Fernando G. <removed_email_address@domain.invalid>:

>  uri = request.request_uri
>  reset_session
>  session[:original_uri] = uri

Eso no es lo mismo que esto?

    session[:original_uri] = request.request_uri
Fernando G. (Guest)
on 2009-01-22 20:23
(Received via mailing list)
2009/1/22 Francesc E. <removed_email_address@domain.invalid>:
> 2009/1/22 Fernando G. <removed_email_address@domain.invalid>:
>
>>  uri = request.request_uri
>>  reset_session
>>  session[:original_uri] = uri
>
> Eso no es lo mismo que esto?
>
>    session[:original_uri] = request.request_uri

Sí si la llamada a reset_session no resetea la request.. que es lo que
no tengo claro.

f.
Jose Antonio P. (Guest)
on 2009-01-22 23:23
La parte del authorize la hace bien. Hay lo importante es que pase por
parametro el uri, y lo pasa. El problema está en el login, que en el
redirect_to el valor de @uri es nil.
Fernando G. (Guest)
on 2009-01-22 23:43
(Received via mailing list)
El día 22 de enero de 2009 22:23, Jose Antonio P.
<removed_email_address@domain.invalid>
escribió:> La parte del authorize la hace bien. Hay lo importante es que pase 
por
> parametro el uri, y lo pasa. El problema está en el login, que en el
> redirect_to el valor de @uri es nil.

Mira a ver el log a ver que parámetros está pasando en el redirect:
redirect_to(:controller => :users, :action => :login, :uri_aux =>
uri)

o pon un
logger.debug( "params: #{params.inspect}" )

al principio de la acción login a ver que le llega

f.
Jose Antonio P. (Guest)
on 2009-01-23 09:43
Fernando G. wrote:
> Mira a ver el log a ver que par�metros est� pasando en el redirect:
> redirect_to(:controller => :users, :action => :login, :uri_aux =>
> uri)
>
> o pon un
> logger.debug( "params: #{params.inspect}" )
>
> al principio de la acci�n login a ver que le llega
>
> f.

 Esto es lo que envia como parametros el redirect_to de authorize:

 params: {"action"=>"login", "uri_aux"=>"/projects/1",
"controller"=>"users"}

 He probado en hacer lo logger.debug mas

 logger.debug( "variable @uri: #{@uri}" ) => no muestra nada

 logger.debug( "variable @uri 1: #{params[:uri_aux]}" ) => /projects/1

 Si le he hecho la asignacion @uri = params[:uri_aux], ¿como es que no
muestran el mismo valor?
 He probado el hacer @uri = params[:uri_aux].to_s, pero lo mismo
que antes, nada.
Daniel R. Troitiño (Guest)
on 2009-01-23 10:39
(Received via mailing list)
2009/1/23 Jose Antonio P. <removed_email_address@domain.invalid>:
>> f.
>  logger.debug( "variable @uri 1: #{params[:uri_aux]}" ) => /projects/1
>
>  Si le he hecho la asignacion @uri = params[:uri_aux], ¿como es que no
> muestran el mismo valor?
>  He probado el hacer @uri = params[:uri_aux].to_s, pero lo mismo
> que antes, nada.

La solución "rápida" sería utilizar params[:uri_aux] en el redirect_to
en vez de @uri, pero aún te queda saber porque @uri desaparece.

Después de mirar el código no puedo ver razones de peso (hay un
reset_session también ahí, pero de lo que veo en el código de Rails
eso no debería hacer un reset a las variables de instancia) y lo único
que se me ocurre es que @uri esté de alguna forma "cogido". Yo
probaría a cambiar el nombre a @return_uri o algo similar.

Y un extra:

session[:current_project_id] =
                user.user_projects.collect{|x|Project.find(x.project_id)}.first

No se podría hacer así:

session[:current_project_id] = user.projects.first

O al menos así:

session[:current_project_id] =
Project.find(user.user_projects.first.project_id)

Lo digo porque recuperas todos los user_projects del usuario,
instancias sus proyectos y al final te quedas con únicamente el
primero.
Jose Antonio P. (Guest)
on 2009-01-23 12:24
 Ya se solucionó!! El problema estaba en que llamaba dos veces al metodo
login. La primera vez para pintar la pantalla de login y la segunda vez
para loguear al usuario. Es por eso que no cogia esos valores. En la
segunda llamada a login no tenia constancia de ello. Por lo tanto he
hecho en hidden_field_tag en la vista para que vuelva a enviar el valor
de params[:uri_aux].
 Muchas gracias por toda la ayuda prestada.

Daniel R. Troitiño wrote:
> Y un extra:
>
> session[:current_project_id] =
>                 user.user_projects.collect{|x|Project.find(x.project_id)}.first
>
> No se podría hacer así:
>
> session[:current_project_id] = user.projects.first
>
> O al menos así:
>
> session[:current_project_id] =
> Project.find(user.user_projects.first.project_id)

 La cuestion con respecto a esto es que user y projects estan
relacionados de dos formas distintas. Un usuario puede estar adscrito a
uno o varios proyectos y puede ser jefe de proyecto de uno o varios
proyectos. Entonces:

 user.projects => devuelve los proyectos en los que user es jefe de
proyecto
 user.user_projects.collect{|x|Project.find(x.project_id)} => devuelve
los proyectos a los que esta adscrito el usuario
Daniel R. Troitiño (Guest)
on 2009-01-23 13:38
(Received via mailing list)
2009/1/23 Jose Antonio P. <removed_email_address@domain.invalid>:
>>
>  user.projects => devuelve los proyectos en los que user es jefe de
> proyecto
>  user.user_projects.collect{|x|Project.find(x.project_id)} => devuelve
> los proyectos a los que esta adscrito el usuario

Entonces juraría que mi segunda propuesta funcionaría como tu
pretendes, y no cargando tanto ni al servidor de bases de datos ni al
servidor de aplicaciones.
This topic is locked and can not be replied to.