2016-05-23 1 views
0

私が参照するERBライブラリはERBです。ERBライブラリを使用してhtml.erbテンプレートのyield文を評価することはできますか?

require 'ERB' 
simple_template = "Statement: <%= yield %>." 
renderer = ERB.new(simple_template) 

私はsimple_templateyield文で使用されるブロックに渡すことができるようにしたいです。 ERBライブラリでこれを行う方法はありますか?

次は動作しません:

renderer.result { "I am yielded" } # LocalJumpError: no block given (yield) 

どちらも行います。

prc = Proc.new { "I am yielded" } 
renderer.result(prc) # TypeError: wrong argument type proc (expected binding) 

ERBライブラリを使用するよりも、これを行うには良い方法はありますか?

この質問は、application.html.erbのRailsアプリケーションで何が起こるかを示しているようです。

更新: yield in ERB without rails

+0

あなたはexec uteロジックとビューファイルからそれを保つ? –

+0

私は自分の(もっと基本的な)バージョンのRails Webフレームワークを実際に実装しようとしています。基本的なapplication.html.erbタイプのビューとyieldステートメントに挿入される別のビューによって形成されたビューをレンダリングします。 – evianpring

答えて

1

あなたは、あなたがテンプレートを使用しますBindingを作成し、前記コンテキストにしたいブロックを渡す必要があります:ここに は私が見つけた質問重複している

require 'erb' 


def render(name) 
    TEMPLATE.result(binding) 
end 

render('evianpring') { 'blocks' } 
# => "evianpring yields to the power of blocks!" 

これがなぜ機能するのかを考えてみましょう。バインドされたドキュメントから:

バインディングの実行コンテキストで利用可能なものはここに作成されていますか? TEMPLATE

  • よう#render()
  • nameのような任意のグローバル我々が通過する必要があります利回りを使用したい場合は、我々はそのため#render()
  • に渡す任意のブロックにローカル

    def render(name) 
        TEMPLATE.result(binding) 
    end 
    
    • すべての変数ブロックから#render()

    +0

    バインディングに関するドキュメントでは、ブロックの使用についてはあまり言及していません(http://ruby-doc.org/core-2.2.0/Binding.html)。これはなぜ機能しないのですか?(以前に変数名を定義していたと仮定します)TEMPLATE.result(binding {"blocks"})。 LocalJumpError:no block given(yield)が生成されます。これはブロックの中に収量を置くことについて私が見落としている拘束力のあるものか、Rubyなのでしょうか? – evianpring

    +0

    私は実際に間違いを犯しました。もともとそこにあった利回りコールは余計です。 – fny

    関連する問題