Created
January 7, 2011 13:25
-
-
Save frnz/769447 to your computer and use it in GitHub Desktop.
Diego
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
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.
btw: que bueno eso de Memoize, lo voy a poner en practica.
Que significa: ||= ?
Y porque pones "session[:user_id]". Porque es :user_id como hash y no simplemente "user_id".
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:
Cool, gracias Franz!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Gracias por tomarte el tiempo de explicarme esto! Pura Vida!