2010-05-18 6 views
1

Je vais avoir un problème bizarre que je ne peux pas retrouver ... Pour contexte, j'ai les ressources des utilisateurs, Registries et Giftlines. Chaque utilisateur a plusieurs registres. Chaque registre a beaucoup de cadeaux. C'est une appartenance à une association pour eux d'une manière inverse. Ce qui se passe essentiellement, c'est que lorsque je crée une ligne de cadeaux, la ligne de cadeaux elle-même est créée correctement, et liée correctement à son registre associé, mais ensuite en train d'être redirigée vers la page d'affichage du registre, le session[:user_id] La variable est effacée et je suis déconnecté.Rails - les informations de session sont effacées?

Pour autant que je peux dire, où il va mal est ici dans le registries_controller:

def show 
    @registry = Registry.find(params[:id]) 
    @user = User.find(@registry.user_id) 
    if (params[:user_id] && (@user.login != params[:user_id])) 
     flash[:notice] = "User #{params[:user_id]} does not have such a registry." 
     redirect_to user_registries_path(session[:user_id]) 
    end 
    end 

Maintenant, pour être clair, je peux faire un spectacle du registre normalement, et rien bizarre se passe. Ce n'est que lorsque j'ai ajouté une ligne de cadeaux que la variable session[:user_id] est effacée.

J'ai utilisé le débogueur et c'est ce qui semble se produire.

(rdb:19) list 
[20, 29] in /Users/kriston/Dropbox/ruby_apps/bee_registered/app/controllers/registries_controller.rb 
    20  render :action => 'new' 
    21  end 
    22 end 
    23  
    24 def show 
=> 25  @registry = Registry.find(params[:id]) 
    26  @user = User.find(@registry.user_id) 
    27  if (params[:user_id] && (@user.login != params[:user_id])) 
    28  flash[:notice] = "User #{params[:user_id]} does not have such a registry." 
    29  redirect_to user_registries_path(session[:user_id]) 
(rdb:19) session[:user_id] 
"tester" 
(rdb:19) 

donc à partir de là, nous pouvons voir que le code a obtenu revenir à la commande show après que l'élément a été ajouté, et que la variable session[:user_id] est toujours réglée.

(rdb:19) list 
[22, 31] in /Users/kriston/Dropbox/ruby_apps/bee_registered/app/controllers/registries_controller.rb 
    22 end 
    23  
    24 def show 
    25  @registry = Registry.find(params[:id]) 
    26  @user = User.find(@registry.user_id) 
=> 27  if (params[:user_id] && (@user.login != params[:user_id])) 
    28  flash[:notice] = "User #{params[:user_id]} does not have such a registry." 
    29  redirect_to user_registries_path(session[:user_id]) 
    30  end 
    31 end 
(rdb:19) session[:user_id] 
"tester" 
(rdb:19) 

En marchant, nous arrivons à ce point. Et le session[:user_id] est toujours défini. À ce stade, l'URL est du format localhost:3000/registries/:id, si params[:user_id] échoue, et la condition if ne se produit pas. (À moins que je suis tout à fait tort>. <)

Alors le bit suivant se produit, qui est

(rdb:19) list 
[1327, 1336] in /Library/Ruby/Gems/1.8/gems/actionpack-2.3.5/lib/action_controller/base.rb 
    1327  end 
    1328 
    1329  def perform_action 
    1330   if action_methods.include?(action_name) 
    1331   send(action_name) 
=> 1332   default_render unless performed? 
    1333   elsif respond_to? :method_missing 
    1334   method_missing action_name 
    1335   default_render unless performed? 
    1336   else 
(rdb:19) session[:user_id] 
"tester" 

Et puis quand je frappe à côté ...

(rdb:19) next 
2: session[:user_id] = 
/Library/Ruby/Gems/1.8/gems/actionpack-2.3.5/lib/action_controller/filters.rb:618 
return index if nesting != 0 || aborted 
(rdb:19) list 
[613, 622] in /Library/Ruby/Gems/1.8/gems/actionpack-2.3.5/lib/action_controller/filters.rb 
    613  private 
    614   def call_filters(chain, index, nesting) 
    615   index = run_before_filters(chain, index, nesting) 
    616   aborted = @before_filter_chain_aborted 
    617   perform_action_without_filters unless performed? || aborted 
=> 618   return index if nesting != 0 || aborted 
    619   run_after_filters(chain, index) 
    620   end 
    621 
    622   def run_before_filters(chain, index, nesting) 
(rdb:19) session 
{:user_id=>nil, :session_id=>"49992cdf2ddc708b441807f998af7ddc", :return_to=>"/registries", "flash"=>{}, :_csrf_token=>"xMDI0oDaOgbzhQhDG7EqOlGlxwIhHlB6c71fWgOIKcs="} 

Le session[:user_id] est effacé et quand la page s'affiche, je suis déconnecté. >. <

Sooo .... Toute idée pourquoi cela se produit? Il juste pour moi que je ne suis pas sûr si je voulais être coller de gros morceaux de sortie de débogage ici ... Quelqu'un me signaler si je ne voulais faire cela. >.>

Et oui, cela se produit seulement quand j'ai ajouté un giftitem, et il me renvoyer à la page de Registre. Lorsque je l'affiche, le même code se produit, mais la variable session[:user_id] n'est pas effacée. Ça me rend un peu folle.

Merci!

--edit: ajout du code de contrôleur de session -

est ici le code de contrôleur de session.

class SessionsController < ApplicationController 
    def new 
    if session[:user_id] 
     redirect_to user_registries_path(session[:user_id]) 
    end 
    end 

    def create 
    # authenticate now returns user_id rather than user 
    if session[:user_id] = User.authenticate(params[:login], params[:password]) 
     #debugger 
     redirect_to user_registries_path(session[:user_id]) 
    else 
     flash[:notice] = "The provided username and password either do not match, or do not exist. Please try again." 
     render :action => 'new' 
    end 
    end 


    def destroy 
    session[:user_id] = nil 
    redirect_to users_path 
    end 

end 

En dehors d'un lien de «déconnexion», la destruction n'est appelée nulle part ailleurs.

Répondre

0

Lorsque vous dites que vous êtes déconnecté, voulez-vous dire que votre utilisateur de session est effacé? Vous avez publié beaucoup d'informations de diagnostic, ce qui est bien, mais vous n'exposez pas la gestion de votre session.

Est-il possible que @user et votre "utilisateur connecté" soient la même variable? Si c'est le cas, il est possible qu'il soit remplacé.

Habituellement, il est préférable d'identifier l'un comme @session_user et reserve @user comme une variable plus générale.

+0

Je dois admettre que j'ai eu du mal à trouver la terminologie à utiliser pour les utilisateurs, les propriétaires de registre, etc. Je pourrais revenir en arrière et changer les noms en @session_user et @user comme vous l'avez recommandé juste pour ma lisibilité et l'amour de la santé mentale. Mais oui, je veux dire que l'utilisateur de session est effacé. Dans mon code, j'utilise 'session [: user_id]' pour identifier si j'ai un utilisateur connecté ou non, et dans ce cas, il est effacé car il s'éloigne des dernières lignes du code show comme je l'ai inclus tout en haut. –

+0

Oh, je ne suis pas sûr de ce que vous recherchez quand vous voulez dire "gestion de session". Que puis-je montrer qui pourrait aider? –

+0

Si vous utilisez [AuthLogic] (http://github.com/binarylogic/authlogic) ou une solution personnalisée pour les sessions, alors vous avez quelque chose dans ApplicationController qui affecte votre variable de session utilisateur, quelle qu'elle soit est. Il n'est pas clair comment la session [: user_id] est assignée, et dans les exemples ici elle n'est pas modifiée. Vous devez définir ce que signifie "déconnecté". – tadman

Questions connexes