【问题标题】:How to make modular helper in Sinatra如何在 Sinatra 中制作模块化助手
【发布时间】:2013-08-23 12:30:51
【问题描述】:

我想在模块中创建一个方法(出于分组原因),可以称为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 的未定义局部变量或方法“会话”

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

【问题讨论】:

  • include UserSession?
  • 那么,你是在暗示我应该在 sinatra 的 helpers 方法之外制作模块,然后包含它吗?它会有同样的问题(无法访问会话变量)

标签: ruby sinatra helper


【解决方案1】:

没关系,我找到了答案,我也试过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

【讨论】:

  • 如果这是为了挂钩安全或所有权代码,您可能还应该添加一个 after // 块来清除存储的会话变量。否则它很可能会持续到同一进程的下一个请求中(在简单的情况下,这将是无害的,并且在下一个请求时被覆盖,但它是一个有风险的数据片段)。
  • 是的,这确实是个问题..当我一次执行两个请求时,它表明旧的静态变量尚未删除.. >___
【解决方案2】:

您可以对 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 需要与 getpost 等如何发挥它们的魔力相兼容,而 helpers 会为您做到这一点。

【讨论】:

  • 不,我也想用模块名称调用方法。UserSession.logged_in?
  • @Kokizzu:这可能是可能的,但我不确定在 Sinatra 框架内如何。该方法需要访问请求的状态。
  • @Kokizzu “我也想用模块名称调用方法.. UserSession.logged_in?” - 为什么?
  • 将某些功能放在正确的类别...(UserSession、HtmlHelper、JsonHelper 等)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2012-12-09
  • 2011-08-24
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
相关资源
最近更新 更多