2011-10-21 16 views
2

私はRails 3.0.9を使用しています。私は液体を使用しようとしており、エラーが発生しています。Rails 3で.liquidファイルを動作させる方法

はここでここで初期化子

class LiquidView 
    PROTECTED_ASSIGNS = %w(template_root response _session template_class action_name request_origin session template 
          _response url _request _cookies variables_added _flash params _headers request cookies 
          ignore_missing_templates flash _params logger before_filter_chain_aborted headers) 
    PROTECTED_INSTANCE_VARIABLES = %w(@_request @controller @_first_render @_memoized__pick_template @view_paths 
            @helpers @assigns_added @template @_render_stack @template_format @assigns) 

    def self.call(template) 
    "LiquidView.new(self).render(template, local_assigns)" 
    end 

    def initialize(view) 
    @view = view 
    end 

    def render(template, local_assigns = nil) 
    @view.controller.headers["Content-Type"] ||= 'text/html; charset=utf-8' 

    # Rails 2.2 Template has source, but not locals 
    if template.respond_to?(:source) && !template.respond_to?(:locals) 
     assigns = (@view.instance_variables - PROTECTED_INSTANCE_VARIABLES).inject({}) do |hash, ivar| 
        hash[ivar[1..-1]] = @view.instance_variable_get(ivar) 
        hash 
       end 
    else 
     assigns = @view.assigns.reject{ |k,v| PROTECTED_ASSIGNS.include?(k) } 
    end 

    source = template.respond_to?(:source) ? template.source : template 
    local_assigns = (template.respond_to?(:locals) ? template.locals : local_assigns) || {} 

    if content_for_layout = @view.instance_variable_get("@content_for_layout") 
     assigns['content_for_layout'] = content_for_layout 
    end 
    assigns.merge!(local_assigns.stringify_keys) 

    liquid = Liquid::Template.parse(source) 
    liquid.render(assigns, :filters => [@view.controller.master_helper_module], :registers => {:action_view => @view, :controller => @view.controller}) 
    end 

    def compilable? 
    false 
    end 

end 

::ActionView::Template.register_template_handler(:liquid, LiquidView) 
ここ

/

<h1>Listing users</h1> 

<table> 
    <tr> 
    <th>Name</th> 
    </tr> 

    {% for user in @users %} 
    <tr> <td> {{ user.name }} </td> </tr> 
    {% endfor %} 

</table> 

をアプリ/ビュー/ユーザーindex.html.liquidさであり、ここではコントローラである私のGemfile

source 'http://rubygems.org' 

gem 'rails', '3.0.9' 
gem 'sqlite3' 
gem 'liquid' 

です

class UsersController < ApplicationController 
    def index 
    @users = User.all 
    respond_to do |format| 
     format.html # index.html.erb 
    end 
    end 
end 

このエラーが発生しています。

undefined method `template' for #<UsersController:0x00000100979b80> 
Extracted source (around line #1): 

1: <h1>Listing users</h1> 
2: 
3: <table> 
4: <tr> 
+0

モデルにあなたがチェックアウトしましたこの投稿:http://stackoverflow.com/questions/5453639/using-liquid-in-rails-3 ? – rb512

+0

私はレール3にフル・ディテールまたは液体テンプレートを掲載しました - > http://stackoverflow.com/questions/1283083/how-can-you-render-a-template-within-a-layout-using -liquid-template-language/8038207#8038207 – Dan

答えて

2

私はこれがちょうど[、:COLUMN_NAME]をliquid_methodsを置くことを忘れてはいけないだけで

class LiquidView 
    def self.call(template) 
    "LiquidView.new(self).render(#{template.source.inspect}, local_assigns)" 
    end 

    def initialize(view) 
    @view = view 
    end 

    def render(template, local_assigns = {}) 
    @view.controller.headers["Content-Type"] ||= 'text/html; charset=utf-8' 

    assigns = @view.assigns 

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

    controller = @view.controller 
    filters = if controller.respond_to?(:liquid_filters, true) 
       controller.send(:liquid_filters) 
       elsif controller.respond_to?(:master_helper_module) 
       [controller.master_helper_module] 
       else 
       [controller._helpers] 
       end 

    liquid = Liquid::Template.parse(template) 
    liquid.render(assigns, :filters => filters, :registers => {:action_view => @view, :controller => @view.controller}) 
    end 

    def compilable? 
    false 
    end 
end 

ActionView::Template.register_template_handler :liquid, LiquidView 

の下のコードで初期化子を変更、あなたを助けるべきだと思います

+0

ありがとうございます。私はしばらく私の頭を傷つけていたし、その原因はself.call(テンプレート)メソッドのようだった。液体ジェムのliquid_viewはrender(テンプレート、...)ですが、render(#{template.source.inspect}、...)はそれを固定しています。 – emilebaizel

関連する問題