Skip to content

Instantly share code, notes, and snippets.

@frnz
Created January 7, 2011 13:25
Show Gist options
  • Save frnz/769447 to your computer and use it in GitHub Desktop.
Save frnz/769447 to your computer and use it in GitHub Desktop.
Diego
# Primero te recomiendo hacer un método 'encript' así:
def encript(hash)
# Devuelve el mismo hash, pero haciéndole digest al password
hash[:password] = Digest::MD5.hexdigest(hash[:password])
return hash
end
# De esa manera podés hacer esto:
post '/signup' do
@user = User.new encript(params[:user])
if @user.save
"done"
else
"error"
end
end
# y esto:
post '/login' do
@user = User.first encript(params[:user])
if @user
session[:logged] = @user.username
redirect "/user/#{@user.id}"
else
haml :login
end
end
# No sólo hace el código menos repetitivo, sino que también es importante
# que en la parte "final" de tu código todo concepto sea encapsulado.
#
#
# La razón es la siguiente:
#
# Digamos que hexdigest sirvió bien al principio, pero más adelante necesitás hacer
# digest con salt xq aparecieron unos hck0rz pichudos. Entonces tenés que cambiar TODAS las líneas que tengan
# 'Digest::MD5.hexdigest'. En tu ejemplo son 2 líneas (pero podrían ser más conforme la aplicación avance)
# te toca buscar todas las líneas y probar cada punto.
# Pero en el ejemplo que te doy eso SIEMPRE va a estar en una línea. Es sólo un cambio.
#
# Esto se conoce como ENCAPSULAMIENTO.
# Otras notas:
# Veo raro:
session[:logged] = @user.username
# No parece obvio que session[:logged] retorna username, yo haría
session[:username] = @user.username
# Pero en realidad haría:
session[:user_id] = @user.id
# Por qué? No sé si le vas a dar la opción de cambiar el username, pero si es así esto podría dar problemas.
# Hablando de encapsulamiento, yo haría:
def log_in(user)
# logs the user into the system
session[:user_id] = user.id
end
def log_out
session[:user_id] = nil
end
# en lugar de is_user?
def user_is_logged?
!session[:user_id].nil?
end
# Mirá que se lee mejor:
redirect "/" unless user_is_logged?
if user_is_logged? ...
# que
redirect "/" unless is_user?
if is_user? ...
# para agarrar el user
def current_user
# http://6brand.com/ruby-speedup-memoize-those-methods.html
@current_user ||= User.get session[:user_id] if user_is_logged?
end
# Y otra cosa, en Ruby se acostumbra poner "!" al final de un método si tiene efectos secundarios fuera del propio método:
def auth!
redirect "/" unless current_user
end
@spacecowb0y
Copy link

Gracias por tomarte el tiempo de explicarme esto! Pura Vida!

@spacecowb0y
Copy link

Mira lo que me retorna encript(hash):
{:password=>"39c8e9953fe8ea40ff1c59876e0e2f28", "username"=>"mitasdf", "password"=>"sdfsdfsdfsdf", "email"=>"mirtda@sakjsdf.com"}

El hash "password" esta dos veces y cuando lo va a guardar, guarda el segundo value.

@frnz
Copy link
Author

frnz commented Jan 7, 2011

@spacecowb0y
Copy link

btw: que bueno eso de Memoize, lo voy a poner en practica.

Que significa: ||= ?

@spacecowb0y
Copy link

Y porque pones "session[:user_id]". Porque es :user_id como hash y no simplemente "user_id".

@frnz
Copy link
Author

frnz commented Jan 10, 2011

session[:user_id] y session["user_id"] es casi lo mismo. :user_id es un poco más eficiente en memoria, naa más.

Que significa: ||= ? Significa "asígnele valor si la variable no tiene valor", pero si tiene, no haga nada.

Entonces:

@hello ||= "hello"

Es lo mismo que hacer:

@hello = "hello" unless defined? @hello

@spacecowb0y
Copy link

Cool, gracias Franz!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment