Metodo login y request_uri

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
¿Olvidó su contraseñ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!!

El día 22 de enero de 2009 10:46, Jose Antonio P.
[email protected]
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é :confused:

f.

2009/1/22 Fernando G. [email protected]:

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

Eso no es lo mismo que esto?

session[:original_uri] = request.request_uri

2009/1/22 Francesc E. [email protected]:

2009/1/22 Fernando G. [email protected]:

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.

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.

El día 22 de enero de 2009 22:23, Jose Antonio P.
[email protected]
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.

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.

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

2009/1/23 Jose Antonio P. [email protected]:

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.

2009/1/23 Jose Antonio P. [email protected]:

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.