编辑 - 我误解了问题的确切性质,转而在此处更好地掌握了问题:Rails / Devise - updating session variables between controller actions
我正在使用会话变量在我的Rails应用程序中的三个表单提交控制器操作之间传递数据,但我遇到的问题是,第一次运行时进程工作但第二次失败,因为会话变量没有传递给后续的控制器操作 - 但是,如果我清除我的浏览器历史记录,它可以正常工作(但如果我尝试重复而不清除历史记录等,则会失败)。该应用程序使用Devise进行用户登录,问题似乎与在注销时被销毁的会话有关。
这里讨论的会话变量是session[:ids]
,似乎没有先清除浏览器历史记录,它就没有从submission
操作传递到approval
操作。
以下是路线:
post 'report/submission'
get 'report/approval'
get 'report/summary' => 'report#summary'
关联的控制器操作(添加了几组puts
来检查控制台中的变量值):
def submission
@incomingReport = ActiveSupport::JSON.decode(params[:report])
@newReportIDArray = Array.new
@incomingReport.each do |x|
#DATA PROCESSING STUFF HERE
@newReportIDArray.push(@new_report.id)
end
session[:ids] = @newReportIDArray
puts "submission_marker"
puts @newReportIDArray
puts "submission_marker_end"
respond_to do |format|
format.json do
render json: {
success: 200
}.to_json
end
end
end
#USER LOGIN OCCURS HERE
def approval
@reportIDs = session[:ids]
puts "approval_marker"
puts @reportIDs
puts "approval_marker_end"
@reportIDs.each do |x|
@new_report = Report.find(x)
@new_report.user_id = current_user.id
@new_report.save
end
redirect_to report_summary_path
end
def summary
@reportIDs = session[:ids]
puts "summary_marker"
puts @reportIDs
puts "summary_marker_end"
end
#USER LOGS OUT AFTER SUMMARY
因此,如果我使用干净的历史记录运行它,我的控制台看起来像这样:
submission_marker
766
submission_marker_end
approval_marker
766
approval_marker_end
summary_marker
766
summary_marker_end
但如果我在第一个summary
之后退出,然后我尝试在不清除历史记录的情况下完成整个过程,那么我最终会
submission_marker
767
submission_marker_end
approval_marker
approval_marker_end
和错误undefined method 'each' for nil:NilClass
,引用@reportIDs.each
操作中的approval
。
我在这里缺少什么?为什么在干净的历史记录中,一切运行正常,但是有了“脏”历史记录,会话变量会为submission
操作设置,但会在/ approval
操作的路上被删除?我看到这与Devise和会话的破坏有关,但我不明白为什么我不能创建一个新的会话变量。