Rails - информация о сеансе очищается? - PullRequest
1 голос
/ 18 мая 2010

У меня странная проблема, которую я не могу отследить ... Для контекста у меня есть ресурсы пользователей, реестров и Giftlines. Каждый пользователь имеет много реестров. В каждом реестре есть много Giftlines. Это принадлежность к ассоциации для них в обратном порядке.

Что в основном происходит, так это то, что когда я создаю подарочную линию, сама подарочная линия создается должным образом и правильно связывается со связанным с ней реестром, но затем в процессе перенаправления обратно на страницу отображения реестра, session[:user_id] переменная очищена, и я вышел из системы.

Насколько я могу сказать, где это идет не так, здесь в 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

Теперь, чтобы было ясно, я могу нормально показывать реестр, и ничего странного не происходит. Только когда я добавил подарочную линию, переменная session[:user_id] очищается.

Я использовал отладчик, и это то, что, кажется, происходит.

(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)

Таким образом, оттуда мы можем видеть, что код вернулся к команде show после добавления элемента и что переменная session[:user_id] все еще установлена.

(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) 

Продолжая, мы добираемся до этой точки. И session[:user_id] все еще установлен. На этом этапе URL имеет формат localhost:3000/registries/:id, поэтому params[:user_id] завершается ошибкой и условие if не возникает. (Если я не полностью неправ>. <) </p>

Итак, происходит следующий бит, который

(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"

А потом, когда я нажму следующий ...

(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="}

session[:user_id] очищается, и когда страница отображается, я выхожу из системы. >. <</p>

Оооо .... Есть идеи, почему это происходит? Мне просто пришло в голову, что я не уверен, что я собираюсь вставлять сюда большие куски вывода отладки ... Кто-то мне скажет, если я не собираюсь это делать. >.>

И да, это происходит только тогда, когда я добавил подарок, и он возвращает меня на страницу реестра. При просмотре происходит тот же код, но переменная session[:user_id] не очищается. Это сводит меня с ума.

Спасибо!

- редактировать: добавлен код контроллера сеанса -

Вот код контроллера сеанса.

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

Помимо ссылки "logout", уничтожение больше не вызывается.

1 Ответ

0 голосов
/ 18 мая 2010

Когда вы говорите, что вышли из системы, вы имеете в виду, что ваш пользователь сеанса очищен? Вы опубликовали много диагностической информации, и это здорово, но вы не рассказываете, как происходит управление сессиями.

Возможно ли, что @user и ваш "зарегистрированный пользователь" - это одна и та же переменная? Если это так, возможно, его можно заменить.

Обычно предпочтительнее идентифицировать один как @session_user и резервировать @user как более универсальную переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...