如何在Sinatra制作模块化助手

时间:2013-08-21 08:20:14

标签: ruby sinatra helper

我想在模块中创建一个方法(用于分组原因),可以调用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':模块

这个问题的最佳解决方案是什么?

2 个答案:

答案 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需要与getpost等工作方式相匹配,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