我想在模块中创建一个方法(用于分组原因),可以调用module.method
,如下所示:
helpers do
module UserSession
def logged_in?
not session[:email].nil?
end
def logout!
session[:email] = nil
end
end
end
但是当我尝试使用UserSession.logged_in?
调用它时,它表示logged_in不是UserSession的方法
未定义的方法`logged_in?' for UserSession:Module
当我将方法移动为UserSession的方法时:
helpers do
module UserSession
def self.logged_in?
not session[:email].nil? # error
end
def self.logout!
session[:email] = nil
end
end
end
它出错,我无法访问session
变量
未定义的局部变量或UserSession的方法`session':模块
这个问题的最佳解决方案是什么?
答案 0 :(得分:5)
您可以对helpers
方法使用不同的约定。
module UserSession
def logged_in?
not session[:email].nil?
end
def logout!
session[:email] = nil
end
end
helpers UserSession
get '/foo' do
if logged_in?
'Hello you!'
else
'Do I know you?'
end
end
模块定义当然可以在另一个(require
d)文件中。
在幕后,helpers <Module>
正在进行include
,但不是简单地进入您正在为您的应用使用的Sinatra应用程序子类。 include
需要与get
,post
等工作方式相匹配,helpers
为您做到这一点。
答案 1 :(得分:2)
没关系,我找到了答案,我也尝试了define_method('UserSession.logged_in?')
,但没有运气
我尝试过的最后一件事是:
# outside helpers
class UserSession
@@session = nil
def initialize session
@@session ||= session
end
def self.check
throw('must be initialized first') if @@session.nil?
end
def self.logged_in?
self.check
not @@session[:email].nil?
end
def self.logout
self.check
@@session.delete :email
end
end
但必须首先调用
before // do
UserSession.new session
end
然后可以根据需要使用:
get '/' do
if UserSession.logged_in?
# do something here
end
end