Sinatra NoMethodError в / undefined метод `stylesheet_link_tag'для #

В настоящее время я делаю приложение с помощью sinatra и часами работаю над тем, чтобы реализовать в нем начальную загрузку и понимаю, насколько это проще в рельсах.

В любом случае, когда я запускаю веб-сервер и захожу в /, я вижу ошибку, относящуюся к строке <%= stylesheet_link_tag 'app', media: 'all' %> который я поместил в свое представление app.erb (индекс моего веб-приложения). Эта строка предназначена для загрузки файла scss в папку assets / stylesheets, и этот файл содержит значения @import для начальной загрузки.

Я использую гем sinatra-asset-pipe и правильно настроил его в соответствии с инструкциями на странице github. За последние 4 часа я много чего пробовал и ничего не получалось. Вот код для наиболее важных файлов:

assets / stylesheets / app.scss:

@import "bootstrap-sprockets";
@import "bootstrap";

views / app.erb:

<!DOCTYPE html>
<html>

  <head>
    <title>Salah Kayali</title>
    <%= stylesheet_link_tag 'app', media: 'all' %>
    <%= javascript_include_tag 'app' %>
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>

  <body>
    <%= partial :header %>
  </body>

</html>

app.rb:

require 'sinatra/partial'
require 'rubygems'
require 'sinatra'
# set :bind, '0.0.0.0'
require 'sinatra/asset_pipeline'

class App < Sinatra::Base
    register Sinatra::Partial
    configure do
    set :assets_precompile, %w(app.js app.scss *.png *.jpg *.svg *.eot *.ttf *.woff)
    set :assets_css_compressor, :sass
    set :assets_js_compressor, :uglifier
        register Sinatra::AssetPipeline

        if defined?(RailsAssets)
      RailsAssets.load_paths.each do |path|
        settings.sprockets.append_path(path)
      end
    end
  end

  enable :partial_underscores
    set :partial_template_engine, :erb

  get '/' do
    erb :app
  end
  run! if __FILE__ == $0
end

config.ru:

require 'rubygems'
require 'bundler'
Bundler.require
run App

Rakefile:

require 'sinatra/asset_pipeline/task'
require './app'

Sinatra::AssetPipeline::Task.define! App

Gemfile:

source "https://rubygems.org"
ruby "2.2.3"

gem 'bundler', '~> 1.10.6'

gem 'sinatra', require: 'sinatra/base'
gem 'sinatra-asset-pipeline', require: 'sinatra/asset_pipeline'

gem 'thin', '~> 1.6.4'

gem 'sass', '~> 3.4.18'

gem 'coffee-script', '~> 2.4.1'

gem 'uglifier', '~> 2.7.2'

gem 'rack-coffee', '~> 1.0.3'

gem 'sinatra-partial'

source 'https://rails-assets.org' do
  gem 'rails-assets-jquery'
  gem 'rails-assets-bootstrap-sass'
end

Я надеюсь, что кто-то может помочь, поскольку я действительно не знаю, что делать. Я обычно привык к рельсам, где ресурсный конвейер уже существует и обо всем позаботится. Однако я заставляю себя сделать это веб-приложение с помощью sinatra, чтобы я мог по-настоящему понять, что на самом деле происходит, когда вы "автоматически" создаете вещи с помощью рельсов.

Вот ссылка на скриншот вывода ошибок в моем браузере: http://puu.sh/ktUIA/1d8396b034.png

1 ответ

Решение

Ваша проблема в том, что stylesheet_link_tag а также javascript_include_tag являются частью ActionView, одной из жемчужин, лежащих в основе Rails (т.е. см. ActionView::Helpers::AssetTagHelper).

Согласно sinatra-asset-pipeline документация:

Теперь, когда все на месте, вы можете использовать все помощники, предоставленные sprockets-helpers

Глядя на sprocket-helpers Например, вам нужно сделать что-то вроде этого:

<link rel="stylesheet" href="<%= stylesheet_path 'application' %>">
<script src="<%= javascript_path 'application' %>"></script>

Итак, что вы ищете stylesheet_path а также javascript_path скорее, чем stylesheet_link_tag а также javascript_include_tag,

Другие вопросы по тегам