У меня странная проблема, которую я не могу отследить ...
Для контекста у меня есть ресурсы пользователей, реестров и 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", уничтожение больше не вызывается.