10

我想在模块中创建一个可以称为 a 的方法(出于分组原因),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?” 对于用户会话:模块

当我将该方法作为 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:Module 的未定义局部变量或方法“会话”

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

4

2 回答 2

6

您可以对该方法使用不同的约定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

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

在幕后,helpers <Module>正在做一个include,但不只是进入您用于您的应用程序的 Sinatra 应用程序子类。include需要与等如何发挥他们的魔力兼容,并get为您做到这一点。posthelpers

于 2013-08-21T08:43:07.133 回答
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
于 2013-08-21T12:16:26.143 回答