Sinatra应用程序共享会话值?
问题描述:
我有一个主Controlller:Sinatra应用程序共享会话值?
class MainController < Sinatra::Base
set :views, File.expand_path('../../templates', __FILE__)
enable :sessions
helpers AppHelper::Main
end
和我有几个其他控制器从MainController继承和拥有地图配置上config.ru
AuthController
自己的路由class AuthController < MainController
# Code above
get_login = lambda do
redirect '/' if session[:admin]
erb :login, :layout => false
end
get '/login', &get_login
# Cobe below
end
config.ru
# code above
map('/') { run AppController } # Another inherited controller...
map('/auth') {run AuthController }
上AppHelper ::主要我有以下的功能,我从AppController的
def authenticated?
session[:admin]
end
上AuthController我可以改变会话路由模板使用[:管理员],但是当我试图访问会话[:管理]在使用认证的模板上?功能它只是返回零,因为它没有改变。我的问题是:sinatra会话通过应用程序共享值?
答
我的问题是:[sinatra会话通过应用程序共享值?
是的,会话cookie应该由给定相同密钥的不同应用共享。
# config.ru
require_relative "app.rb"
map('/') { run AppController } # Another inherited controller...
map('/auth') {run AuthController }
# app.rb
require 'sinatra/base'
class MainController < Sinatra::Base
#set :views, File.expand_path('../../templates', __FILE__)
enable :sessions
#helpers AppHelper::Main
get '/' do
"#{self.class.name}: value = " << session[:value].inspect
end
get '/:value' do
session['value'] = params['value']
"#{self.class.name}: value = " << session[:value].inspect
end
end
class AuthController < MainController
end
class AppController < MainController
end
使用这个我能够访问任何一个控制器中的数据,而不管哪一个设置它。我认为你的问题在别处。我建议使用encrypted_cookie并将其设置为config.ru
以供应用程序使用,但它可能会增加Cookie的安全性。
谢谢@iain。当我看到[这个问题](http://stackoverflow.com/questions/18844863/sinatra-clears-session-on-post)和它的答案我可以解决这个问题。 –