Как вставить мой HTML/ шаблон в каждый тег <body>?

Я хотел бы вставить часть произвольного HTML-кода (или, предпочтительно, другой шаблон Markaby) внутри <body> тег на каждой из моих страниц веб-приложения.

Я использую Markaby, что означает, что шаблон является (более или менее) классом Ruby и body это его метод. Таким образом, должна быть возможность написать некоторый код Ruby для перехвата body вызов метода и вставка моего HTML.

Как мне это сделать с Синатрой?

2 ответа

Это может быть сделано путем переопределения body метод в Маркаби Builder учебный класс. Этот кусок кода сделает это:

class Markaby::Builder
  alias body_orig body
  def body(*args, &block)
    str = capture(&block)
    block = proc { text('ON EVERY PAGE' + str) }
    body_orig(*args, &block)
  end
end

И этот будет включать в себя еще один шаблон Markaby как первое body тег:

class Markaby::Builder
  alias body_orig body
  def body(*args, &block)
    str = capture(&block)
    str2 = render :mab, :include_template_name, *args
    block = proc { text(str2 + str) }
    body_orig(*args, &block)
  end
end

Что мешает вам использовать <%= yield %> в вашем макете? Например, код ниже будет отображать ваш текущий вид внутри макета <body> теги с помощью <%= yield %>

В этом случае шаблон layout.erb и страница hello.erb, hello.erb отображается внутри layout.erb вместо <%= yield %>заявление. Это то, что вы имели в виду?

require 'sinatra'

get '/hello/:name' do
  @name = params[:name]
  erb :hello
end

__END__
@@ layout
<html>
  <body>
   <%= yield %>
  </body>
</html>

@@ hello
<h3>Hello <%= @name %>!</h3>

Код от About.com - Синатра

Другие вопросы по тегам