2011-10-21 6 views
2

Я использую Rails 3.0.9. Я пытаюсь использовать жидкость, и я получаю сообщение об ошибке.Как создать файл .liquid в Rails 3

Вот мой Gemfile

source 'http://rubygems.org' 

gem 'rails', '3.0.9' 
gem 'sqlite3' 
gem '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) 

Вот приложение/просмотров/пользователей/index.html.liquid

<h1>Listing users</h1> 

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

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

</table> 

А вот контроллер

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

Я думаю, что это должно помочь вам, просто изменить инициализатору с кодом ниже

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 

просто не забудьте положить liquid_methods [,: column_name] к модели

+0

Большое спасибо за это. Некоторое время я царапал себе голову, и, похоже, виновником был метод self.call (шаблон). Жидкостное изображение в жидком самоцвете имеет визуализацию (шаблон, ...), но изменение его на рендеринг (# {template.source.inspect}, ...) исправлено. – emilebaizel

Смежные вопросы