从proc中访问sinatra变量

时间:2013-08-11 19:56:13

标签: ruby scope sinatra

我使用模块化的Sinatra,使用这些代码

def is_login?
   session[:auth_token].nil? # error: undefined variable or method `session` 
end

if is_login?
   menu['Logout'] = '/logout'
else 
   menu['Login'] = '/login'
end

get '/logout' do
   session[:auth_token] = nil
end

这些代码返回错误undefined local variable or method 'session' for main:Object,因为会话仅在get内部工作,如何从外部访问会话哈希?

我已经尝试了另一种方法,即将is_login?移动到帮助器中并将其作为define_method移动,以便它可以访问session,但出现了类似的问题,我无法如果未定义,请致电is_login?,此处为以下代码:

helpers do
  define_method :logged_in? do
    session[:access_token].nil?
  end
  if is_login? # error: undefined method `logged_in?`
    menus['Logout'] = '/logout'
  else
    menus['Login'] = '/login'
  end
end

1 个答案:

答案 0 :(得分:1)

会话仅在请求的上下文中有意义。因此,在外面使用它(例如在上面给出的if表达式中)将不会成功。

相反,请在请求中使用它。例如

get '/' do
  if is_login?
    # your code
  else
    # your code
  end
end