如何在Sinatra中使用Haml partials的本地(或每个视图)变量?

时间:2012-07-21 04:04:36

标签: sinatra haml scope

我在Sinatra有一个Haml部分处理我所有的'页面打开'项目,如元标记。

我希望在此部分中为page_title设置变量,然后在每个视图中设置该变量。

部分内容如下:

%title @page_title

然后在视图中,允许做类似的事情:

@page_title = "This is the page title, BOOM!"

我已经阅读了很多问题/帖子等,但我不知道如何要求解决我想要做的事情。我来自Rails,我们的开发人员通常使用content_for,但他们设置了所有这些。我真的想知道它是如何工作的。似乎我必须定义它并使用:本地人以某种方式,但我还没弄明白。提前感谢您的任何提示!

1 个答案:

答案 0 :(得分:12)

您将变量传递给Sinatra haml partials,如下所示:

page.haml

!!!
%html{:lang => 'eng'}
    %body
        = haml :'_header', :locals => {:title => "BOOM!"}

_header.haml

   %head
       %meta{:charset => 'utf-8'}
       %title= locals[:title]

在页面标题的情况下,我只是在我的布局btw中执行类似的操作:

layout.haml

%title= @title || 'hardcoded title default'

然后在路由中设置@title的值(使用帮助器保持简短)。

但是如果您的标题是部分标题,那么您可以将两个示例合并为:

layout.haml

!!!
%html{:lang => 'eng'}
    %body
        = haml :'_header', :locals => {:title => @title}

_header.haml

   %head
       %meta{:charset => 'utf-8'}
       %title= locals[:title]

app.rb

helpers do
  def title(str = nil)
    # helper for formatting your title string
    if str
      str + ' | Site'
    else
      'Site'
    end
  end
end


get '/somepage/:thing' do
  # declare it in a route
  @title = title(params[:thing])
end