yield in ERB without rails

前端 未结 6 1727
轮回少年
轮回少年 2020-12-30 05:49

How can I use yield for template inheritance in erb? I want to use erb in a plain ruby CGI script and want to use a base template and subtemplate like it Rails wit

相关标签:
6条回答
  • 2020-12-30 06:10

    I don't think you can - Rails provides that infrastructure as part of actionpack.

    What you may be able to do is take actionpack and add it into your script.

    Alternatively you could roll a lightweight templating system yourself.

    Alternatively alternatively use Rails or Merb or Sinatra.

    0 讨论(0)
  • 2020-12-30 06:10

    You can use Tilt but if you don't want to add an extra dependency, here's a better example on how you can yield in erb:

    require "erb"
    
    class Controller
      TEMPLATE = ERB.new("Hello <%= @someone %>\n\n<%= yield %>")
    
      def initialize(someone)
        @someone = someone
      end
    
      def render
        TEMPLATE.result(self.get_binding { yield })
      end
    
      def get_binding
        binding
      end
    end
    
    puts Controller.new("World").render { "I'm Jack" }
    # =>
    Hello World
    
    I'm Jack
    

    I found the answer here.

    0 讨论(0)
  • 2020-12-30 06:16

    I wrote about adding this to the Standard Library's ERB here http://hostiledeveloper.com/2015/05/28/working-with-templates-in-ruby-erb.html

    It's surprisingly a pain in the butt.

    0 讨论(0)
  • 2020-12-30 06:17

    app.rb

    require 'erb'
    
    class Template
        def render(template_name="base")
            ERB.new(File.read("#{template_name}.erb")).result(binding)
        end
    end
    
    result = Template.new.render do
        ERB.new(File.read("index.erb")).result
    end
    
    puts result
    

    base.erb

    <main>
        <%= render "footer" %>
        <%=yield %>
    </main>
    

    index.erb

    <h1>Index Page</h1>
    

    footer.erb

    <h1>Footer here</h1>
    

    output image:

    0 讨论(0)
  • 2020-12-30 06:23
    def a
      ERB.new('<%= yield %>').result(binding)
    end
    a{123}
    #=> "123"
    

    It's important that the call to Kernel#binding be inside a method, that way the context includes the block (ERB#result won't take a block).

    0 讨论(0)
  • 2020-12-30 06:29

    Check out Tilt (http://github.com/rtomayko/tilt/). It's the gem that handles templating in Sinatra and it provides ERB yields along with many other nice features.

    0 讨论(0)
提交回复
热议问题