【问题标题】:How can I use views and layouts with Ruby and ERB (not Rails)?如何在 Ruby 和 ERB(不是 Rails)中使用视图和布局?
【发布时间】:2014-11-02 02:27:16
【问题描述】:

如何在 Ruby 和 ERB(不是 Rails)中使用视图和布局?

今天我正在使用此代码来呈现我的视图:

def render(template_path, context = self)
 template = File.read(template_path)
 ERB.new(template).result(context.get_binding)
end

这很好用,但是我怎样才能实现相同的功能,但要在布局中呈现模板呢?我想调用 render_with_layout(template_path, context = self),这样它就会有一个默认布局。

【问题讨论】:

  • render_with_layout 是 Rails 特有的东西。你准备好重新实现它了吗?

标签: ruby sinatra erb rack


【解决方案1】:

既然你用 Sinatra 标记了它,我假设你是我们 Sinatra。

默认情况下,您的视图会在名为 layout.erb 的默认布局中呈现

get "/" do
   erb :index
end

这会使用默认布局呈现您的视图索引。

如果您需要多个布局,您可以指定它们。

get "/foo" do
   erb :index, :layout => :nameofyourlayoutfile
end

* 如果你不使用 Sinatra,你可能想从那里借用代码。

【讨论】:

    【解决方案2】:

    如果您使用Tilt gem(我认为这是 Sinatra 使用的),您可以执行类似的操作

    template_layout = Tilt::ERBTemplate.new(layout)
    template_layout.render { 
      Tilt::ERBTemplate.new(template).render(context.get_binding)
    }
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 Sinatra,那么它具有良好的文档和嵌套布局的主题之一(请参阅 Sinatra README

      使用特殊的默认布局文件(layout.haml 或 layout.erb 在您的视图目录中)也是一个好主意。此文件将始终用于渲染其他文件。这是 layout.haml 的示例:

      !!!5
      %html
        %head
          ##<LOADING CSS AND JS, TILE, DESC., KEYWORDS>
        %body
          =yield ## THE OTHER LAYOUTS WILL BE DISPALYED HERE
          %footer
            # FOOTER CONTENT
      

      【讨论】:

        【解决方案4】:

        感谢大家的回答!

        我终于通过这样做解决了它,我希望其他人也能发现这段代码有用:

        def render_with_layout(template_path, context = self)
        template = File.read(template_path)
        render_layout do
          ERB.new(template).result(context.get_binding)
        end
        end
        
        def render_layout
        layout = File.read('views/layouts/app.html.erb')
        ERB.new(layout).result(binding)
        end
        

        我这样称呼它:

        def index
        @books = Book.all
        body = render_with_layout('views/books/index.html.erb')
        [200, {}, [body]]
        end
        

        然后它将使用硬编码(到目前为止)布局呈现我的视图..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多