2009-08-15 6 views
8

私は、液体レイアウト内で液体テンプレートをレンダリングしようとしています(液体レイアウトは、CSSの液体レイアウトのものではありません)。私はレンダリングするレイアウト部分を得ることができません。現在使用して:Liquidテンプレート言語を使用してレイアウト内でテンプレートをレンダリングするにはどうすればよいですか?

assigns = {'page_name' => 'test'} 
@layout = Liquid::Template.parse(File.new(@theme.layout.path).read) 
@template = Liquid::Template.parse(File.new(self.template.path).read) 

@rend_temp = @template.render(assigns) 
@rend_layout = @layout.render({'content_for_layout' => @rend_temp}) 

render :text => @rend_layout, :content_type => :html 

ページの結果のHTMLは、「テンプレート」は、液体罰金にレンダリングすることを示しているが、それは、レイアウトでラップされていません(レンダリングされたテンプレートとレイアウトで「content_for_layout」を置き換える)

答えて

7

誰もがこの問題を抱えていることを知らせるために、上に掲載されたコードが実際に動作します。問題は、@ templateという名前の変数にあります。私は@templateの名前を変更し、@ layoutを@_tempalteに、@ layoutを@_layoutに変更しました。 Ruby on Railsの中の液体を使用するための

+0

はいのために液滴を追加しましたが、テンプレートの検索とあなたは上記のコードで見送るレールから継承する他のグッズの一部のハイジャックがあります。それが動作している間、それはスタイルや機能性の点で「レール・アイ」ではありません。 – Dan

2

(特に3をレール) - 次のように私はあなたの液体のテンプレートをレンダリングするための適切な方法(ともすべての作業のレールを維持するには、あなたのためにやっている)と信じては...

液体ジェムはそれ自体が液体のためのビューを提供するので、あなたは#renderを呼び出すときに "液体"テンプレートを探すためにレールを配線することができます。このliquid_viewはレール2.3 で完全に動作しますが、簡単にこれはここで見ることができ、次の更新プログラムを

if content_for_layout = @view.instance_variable_get("@content_for_layout") 
    assigns['content_for_layout'] = content_for_layout 
elsif @view.content_for?(:layout) 
    assigns["content_for_layout"] = @view.content_for(:layout) 
end 
assigns.merge!(local_assigns.stringify_keys) 

を行うことにより、レール3で動作するように更新することができます - >https://github.com/danshultz/liquid/commit/e27b5fcd174f4b3916a73b9866e44ac0a012b182

そして、正しく液体をレンダリングしますビューだけで自動的にrだけデフォルトの地元の人々を含めるために、我々は共通液属性の一握りを持っているので、我々は我々のベースコントローラに「レンダリング」メソッドをオーバーライドしている、我々のアプリケーションでは

render :template => "index", :layout => "my_layout", :locals => { liquid_drop1 => drop, liquid_drop2 => drop } 

を呼び出しますロールアップeferencing #liquid_view_assignsは、さらにレンダリングコール

def render(...) 
    options[:locals] = options.fetch(:locals, {}).merge(liquid_view_assigns) 
    super 
end 
関連する問題