【问题标题】:Variables for all views in Sinatra erb filesSinatra erb 文件中所有视图的变量
【发布时间】:2015-12-28 14:52:34
【问题描述】:

在 sinatra 中分配可用于所有视图(所有 erb 文件)的变量的最佳方法是什么。

我知道它可以在主文件中使用全局变量来完成,比如说 app.rb,但是有没有更好的方法可以在不使用全局变量的情况下做到这一点? 例如在 app.rb 中,我可以这样做:

@@a = "hello"
get '/' do
    erb :index
end

get '/hi' do
    erb :page
end

在 index.erb 和 page.erb 文件中:

<%= @@a %>

但是有没有办法在不使用全局变量的情况下做到这一点,或者全局变量是最好的方法吗?

【问题讨论】:

  • 只使用@a 有什么问题?这应该工作
  • 您可以使用常量。您可以定义一个辅助方法。您可以将会话变量用于每个用户的值。您可以使用全局变量。也许如果您明确了您的实际需求,您会得到更具体的帮助您的答案。
  • 大家好,我发现使用helper do; end; 是最好的方法。谢谢大家的回答。欣赏它!

标签: ruby sinatra erb


【解决方案1】:

创建一个包含您想要访问的所有字符串/变量的常量的模块。所有视图都可以访问您的模块:

module StringConstants
    LOGIN_PAGE = "Welcome to X"
    LOGOUT = "See you again soon"
end 

那么在你看来:

<%= StringConstants::LOGIN_PAGE %>

【讨论】:

  • 谢谢@martin。以及定义将在主 app.rb 文件中的所有路由中使用的变量的最佳方法是什么?我应该在哪里以及如何定义它?例如,在我的示例中,我应该在哪里定义我想在 '/''/hi' 中使用的变量?
  • 这是一个常数,还是在登录后会因用户而异?
  • 我想定义一个变量,该变量可用于 app.rb 中的所有路由以及所有 erb 文件中。我只是不想使用全局变量。
  • 这不是一个全局变量。您仍然需要提及模块才能访问其内部变量。
【解决方案2】:

会话变量通常用于跨视图访问。在 sinatra 中,它只是您的标准哈希:

session[:whatever] = "Hello"

一旦设置,就可以在任何地方访问。它将在每个用户会话中独立存在。

例如,我使用的一个常用助手是:

# set session[:user] = user's ID when they log in

def user
  @user ||= User.get(session[:user])
end

您可以使用user 在您的视图或控制器中访问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多