Utilizando variáveis de variável de sessão nos Models

302 views
Skip to first unread message

Samuel Vinícius

unread,
Dec 7, 2010, 11:19:09 AM12/7/10
to rails-br
Como faço para utilizar uma variável de sessão em um model?

por ex.: tenho o dado em sessão session[:user] que quero fazer algo
como:


class Contact < ActiveRecord::Base

def logado?
session[:user].blank? false : true
end

end

Samuel Vinicius

unread,
Dec 7, 2010, 11:25:25 AM12/7/10
to rails-br
Corrigindo o assunto:  "Utilizando variáveis de sessão nos Models "


--
Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/rails-br?hl=pt-BR.


Pablo Borges

unread,
Dec 7, 2010, 11:33:30 AM12/7/10
to rail...@googlegroups.com
O ideal era que você não usasse.
No exemplo que você deu:

 def logado?(user)
   user.present?
 end


e no controller:

logado?(params[:user])

2010/12/7 Samuel Vinicius <samu...@gmail.com>



--
Pablo Borges

Anderson Dias

unread,
Dec 7, 2010, 11:35:49 AM12/7/10
to rail...@googlegroups.com
Ola Samuel,

Acho que seu problema pode ser resolvido de outra forma.

No exemplo que vc mesmo colocou eu faria o seguinte.

Armazenaria na session o id do usuário logado:

session[:user_id] = usuario.id

E no application controller definiria um metodo:

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id].present?
end

Com isso você teria no seus controller o acesso ao usuário logado.

Acho que deve ser mais ou menos isso que você precisa.

--
Anderson Dias
Rails developer at tink!



2010/12/7 Samuel Vinicius <samu...@gmail.com>

Pablo Borges

unread,
Dec 7, 2010, 11:41:39 AM12/7/10
to rail...@googlegroups.com
Onde eu coloquei params[:user] era pra ter sido session[:user].

2010/12/7 Pablo Borges <pablo...@gmail.com>

Samuel Vinicius

unread,
Dec 8, 2010, 6:08:15 AM12/8/10
to rail...@googlegroups.com
Obrigado a todos, 

este exemplo que eu mostrei foi a penas para ilustrar o que eu quero, mas o que pretendo fazer não essa verificação especifica.

Na verdade, tenho uma classe que minha aplicação  utiliza em várias partes do código. E apareceu a necessidade de utilizar session[:user] nesta classe. Ou seja, gostaria de evitar  de ter que alterar todas as chamadas de um determinado método dessa classe, fazer com que o ActiveModel possa ver o sessions dos controllers

Thiago Barreto

unread,
Dec 8, 2010, 7:41:56 AM12/8/10
to rail...@googlegroups.com
Cara, mesmo que você consiga fazer isso, será péssimo para a qualidade do seu código.

Model só deve conhecer coisas do modelo de negócios, a sessão não tem nada a ver com isso

Tenta reavaliar porque tu tá pensando em fazer isso, com certeza existe uma solução melhor


Thiago Barreto

Igor Batista

unread,
Dec 8, 2010, 8:03:01 AM12/8/10
to rail...@googlegroups.com
Será que nao caberia fazer modulo ?
[]'s
Igor C. Batista
ICQ: 89290134
MSN: igor.proi...@hotmail.com
SKYPE: mld_crark
G -TALK: igor.b...@gmail.com

Tem um segundo? Então, dá uma olhadinha nisso:
Um site de publicidades, de Portugal, está pagando em euros (quase 3x mais que em reais)
pra quem estiver disposto visitem:
http://ptcganhandodinheiro.blogspot.com/

Maurício Linhares

unread,
Dec 8, 2010, 8:19:53 AM12/8/10
to rail...@googlegroups.com
Se você tem essa necessidade, pode ser um sinal de que o seu código
está meio enrolado, depender do acesso a sessão dentro de um model não
é uma coisa natural (e você provavelmente vai se arrepender disso no
futuro...).

Mas já que você quer tanto fazer isso, a forma mais simples é usando
thread locals. No seu application_controller você faria algo assim:

before_filter :setup_thread_locals

def setup_thread_locals
Thread.current[:current_user] = self.current_user
end

after_filter :clear_thread_locals

def clear_thread_locals
Thread.current[:current_user] = nil
end

Aí lá dentro do seu model você acessa ele normalmente via
Thread.current[:current_user]

Mas não diga que você não foi avisado :)

-
Maurício Linhares
http://codeshooter.wordpress.com/ | http://twitter.com/mauriciojr

2010/12/8 Samuel Vinicius <samu...@gmail.com>:

Bruno Andrade

unread,
Dec 8, 2010, 3:30:27 PM12/8/10
to rail...@googlegroups.com
Olá Samuel,

  O grande lance, eh sobre responsabilidades de objetos, e um user não deveria informar se esta ou não logado, dado que isso é uma informacao de sistema não do dominio.

  Você pode fazer de varias formas, com modulo, ou sessão no banco de dados, mas de qualquer maneira alguém lhe diz se um user esta logado ou não..   eu gosto de fazer assim

class RepositorioSession
 
   def esta_logado?(user)
        session[:user] == user
   end
end

a vantagem aqui eh poder user esse objeto no sistema todo, e apenas chamei de repositorio como um local que "guarda" os usuarios logados, em nada tem a ver com DDD :)



abraços

Bruno Andrade



brunosps

unread,
Dec 9, 2010, 6:42:38 AM12/9/10
to rails-br
Samuel tive uma dúvida parecida a pouco tempo ..

http://groups.google.com/group/rails-br/browse_thread/thread/e5725590735e9e28/81059f43b69cfd8a?q=#81059f43b69cfd8a

dá uma olhada lá .. como resolvi esse problema.

[]'s
Reply all
Reply to author
Forward
0 new messages