我有一个主控制器:
class MainController < Sinatra::Base
set :views, File.expand_path('../../templates', __FILE__)
enable :sessions
helpers AppHelper::Main
end
我还有一些其他的控制器继承自MainController并且在config.ru上有自己的路由配置 map
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 :: Main上我有以下函数,我在从AppController路由的模板上使用
def authenticated?
session[:admin]
end
在AuthController上我可以更改会话[:admin],但是当我尝试在使用已验证?功能的模板上访问会话[:admin]时,它只返回 nil ,因为它没有改变。我的问题是: sinatra会话通过Apps分享价值?
答案 0 :(得分:1)
我的问题是:[确实] sinatra会话通过Apps分享价值?
是的,会话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的安全性。