Невозможно использовать макеты HAML с Middleman

У меня возникли проблемы с переключением с файла layout.erb по умолчанию на эквивалентный файл layout.haml в Middleman. Я хочу использовать HAML для своих макетов, так как пытаюсь с ним познакомиться, поэтому я решил заменить макет по умолчанию версией HAML. К сожалению, когда я заменяю layout.erb на layout.haml, я получаю эту ошибку:

NoMethodError at /
undefined method `force_encoding' for nil:NilClass

Ruby    /Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb: in ensure in binary, line 289
Web GET localhost/

Traceback (innermost first)

/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb: in ensure in binary
      string.force_encoding(original_encoding)...
/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb: in binary
      string.force_encoding(original_encoding)...
/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb: in extract_magic_comment
      binary script do...
/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb: in extract_encoding
      extract_magic_comment(script) || script.encoding...
/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb: in precompiled
        template_encoding = extract_encoding(template)...
/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/erb.rb: in precompiled
        source, offset = super...
/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/erb.rb: in precompiled
        source, offset = super...
/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb: in compile_template_method
      source, offset = precompiled(locals)...
/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb: in compiled_method
        compile_template_method(locals_keys)...
/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb: in evaluate
      method = compiled_method(locals.keys)...
/Library/Ruby/Gems/2.0.0/gems/tilt-1.4.1/lib/tilt/template.rb: in render
      evaluate scope, locals || {}, &block...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/core_extensions/rendering.rb: in render_individual_file
          content = template.render(context, locs, &block)...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/core_extensions/rendering.rb: in render_template
            content = render_individual_file(layout_path, locs, opts, context) { content }...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/sitemap/resource.rb: in block in render
          app.render_template(source_file, locs, opts, blocks)...
/Library/Ruby/Gems/2.0.0/gems/activesupport-4.1.4/lib/active_support/notifications.rb: in instrument
          yield payload if block_given?...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/util.rb: in instrument
        ::ActiveSupport::Notifications.instrument(suffixed_name, payload, &block)...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/application.rb: in instrument
    delegate :instrument, to: ::Middleman::Util...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/sitemap/resource.rb: in instrument
      delegate :logger, :instrument, to: :app...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/sitemap/resource.rb: in render
        instrument 'render.resource', path: relative_source, destination_path: destination_path  do...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/core_extensions/request.rb: in process_request
            output = resource.render do...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/core_extensions/request.rb: in block in call!
            process_request(env, req, res)...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/core_extensions/request.rb: in catch
          catch(:halt) do...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/core_extensions/request.rb: in call!
          catch(:halt) do...
/Library/Ruby/Gems/2.0.0/gems/middleman-core-3.3.3/lib/middleman-core/core_extensions/request.rb: in call
          dup.call!(env)...
/Library/Ruby/Gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb: in call
      to_app.call(env)...
/Library/Ruby/Gems/2.0.0/gems/rack-1.5.2/lib/rack/urlmap.rb: in block in call
        return app.call(env)...
/Library/Ruby/Gems/2.0.0/gems/rack-1.5.2/lib/rack/urlmap.rb: in each
      @mapping.each do |host, location, match, app|...
/Library/Ruby/Gems/2.0.0/gems/rack-1.5.2/lib/rack/urlmap.rb: in call
      @mapping.each do |host, location, match, app|...
/Library/Ruby/Gems/2.0.0/gems/rack-1.5.2/lib/rack/showexceptions.rb: in call
      @app.call(env)...
/Library/Ruby/Gems/2.0.0/gems/rack-1.5.2/lib/rack/head.rb: in call
    status, headers, body = @app.call(env)...
/Library/Ruby/Gems/2.0.0/gems/rack-1.5.2/lib/rack/lint.rb: in _call
      status, headers, @body = @app.call(env)...
/Library/Ruby/Gems/2.0.0/gems/rack-1.5.2/lib/rack/lint.rb: in call
      dup._call(env)...
/Library/Ruby/Gems/2.0.0/gems/rack-1.5.2/lib/rack/builder.rb: in call
      to_app.call(env)...
/Library/Ruby/Gems/2.0.0/gems/rack-1.5.2/lib/rack/handler/webrick.rb: in service
        status, headers, body = @app.call(env)...
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/webrick/httpserver.rb: in service
      si.service(req, res)...
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/webrick/httpserver.rb: in run
          server.service(req, res)...
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/webrick/server.rb: in block in start_thread
          block ? block.call(sock) : run(sock)

layout.erb выглядит так:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">

    <!-- Always force latest IE rendering engine or request Chrome Frame -->
    <meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">

    <!-- Use title if it's in the page YAML frontmatter -->
    <title><%= current_page.data.title || "The Middleman" %></title>

    <%= stylesheet_link_tag "normalize" %>
    <!-- <%= stylesheet_link_tag "normalize", "all" %> -->
    <%= javascript_include_tag  "all" %>
  </head>

  <body class="<%= page_classes %>">
    <%= partial "header" %>
    <%= yield %>
    <%= partial "footer" %>
  </body>
</html>

layout.haml не имеет такого же содержимого, как layout.erb, но это, похоже, не имеет значения, поскольку оно ломается, несмотря ни на что:

!!!
%html
  %head
    %title
      = current_page.data.title || "The Middleman"
    = stylesheet_link_tag "normalize", "all"
    = javascript_include_tag "all"
  %body
    = partial "header"
    = yield
    = partial "footer"

Сначала я подумал, что ошибка возникает только из-за того, что сам HAML не работает, но даже очень простой файл HAML, который определяет только теги doctype, html, head, title и body, ломается. Затем я заподозрил, что в качестве файлов макета берутся только файлы ERb, что я и подтвердил, переименовав layout.haml в layout.erb, что не вызвало ошибки, а вместо этого просто отобразило необработанный код HAML. Даже сохранение layout.erb и создание вложенного макета article_layout.haml вызывает аналогичную ошибку при переходе к статье блога, в то время как создание article_layout.erb работает нормально.

Так что я подозреваю, что Миддлман просто не примет ничего, кроме ERb для файлов макетов. Однако я не могу найти ничего об этом в документации, и я даже видел примеры, в которых все файлы layout.haml работают отлично. Просто мой другой? Есть ли флаг, который мне нужно установить с помощью middleman init, чтобы использовать файлы HAML для макетов? Что происходит?


person r.pazyaquian    schedule 03.08.2014    source источник
comment
Я идиот. Я понял, что мне нужно перезапускать сервер Middleman всякий раз, когда я меняю файл макета, который использую. layout.haml, layout.html.haml и т. д. работает нормально, когда я перезапускаю его. Извини за это!   -  person r.pazyaquian    schedule 04.08.2014
comment
Ой, я тоже дурак....   -  person Benjamin    schedule 08.10.2014
comment
Лол тоже самое, спасибо!   -  person alex88    schedule 21.01.2015
comment
приятно видеть простых людей здесь, в stackoverflow   -  person Walrus the Cat    schedule 16.04.2015
comment
Мы должны основать клуб.   -  person D. Patrick    schedule 16.05.2015
comment
Да, клуб идиотов. Спасибо за это.   -  person LukyVj    schedule 14.03.2016


Ответы (1)


Как упоминалось в комментариях @r.pazyaquian, если вы измените тип файла макета, обязательно перезапустите сервер.

person bcackerman    schedule 27.11.2015