如何在Sinatra制作模块化助手

Kok*_*zzu 10 ruby helper sinatra

我想在模块中创建一个方法(用于分组原因),可以将其称为a module.method,如下所示:

helpers do
  module UserSession
    def logged_in?
      not session[:email].nil?
    end
    def logout!
      session[:email] = nil
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用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
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误,我无法访问该session变量

未定义的局部变量或UserSession:Module的方法`session'

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

Nei*_*ter 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
Run Code Online (Sandbox Code Playgroud)

模块定义当然可以在另一个(required)文件中.

在幕后,helpers <Module>正在做一个include,但不是简单地进入你正在为你的应用程序使用的Sinatra应用程序子类.在include需要进行与兼容性如何get,post工作等的魔术,并helpers不会为你.