如何使用 Sinatra 指定自定义 Sass 目录

Dr.*_*ein 5 ruby routes path sass sinatra

我不想从默认的“views”目录中提供我的 Sass 文件,而是将其更改为/assets/sass

以下尝试位于应用程序的主 ruby​​ 根文件中:

尝试1:

set :sass, Proc.new { File.join(root, "assets/sass") }

get '/stylesheet.css' do
    sass :core
end
Run Code Online (Sandbox Code Playgroud)

这样我得到以下错误:

 myapp.rb:17 NoMethodError: undefined method `merge' for "/Users/x/x/x/mysinatraapp/assets/sass":String
Run Code Online (Sandbox Code Playgroud)

尝试2:

get '/stylesheet.css' do
    sass :'/assets/sass/core'
end
Run Code Online (Sandbox Code Playgroud)

尝试3:

get '/stylesheet.css' do
    sass :'/assets/sass/core'
end
Run Code Online (Sandbox Code Playgroud)

两者都返回以下错误:

Errno::ENOENT: No such file or directory - ./views/assets/sass/core.sass
Run Code Online (Sandbox Code Playgroud)

尝试4:

get '/stylesheet.css' do
    sass :'../assets/sass/core'
end
Run Code Online (Sandbox Code Playgroud)

这有效!但是,一定有什么东西可以set :sass, Proc.new { File.join(root, "assets/sass") }为我做好准备吗?

Kon*_*ase 1

目前还没有这样的方法,因为 Sinatra 目前只接受单个视图目录。

您可以尝试使用sinatra-compass并且set :compass, :sass_dir => 'assets'仅在视图文件夹中放置一个 sass 文件,这将简单地@import stylesheet.sass或者您可以覆盖#sass

helpers do
  def sass(template, *args)
    template = :"#{settings.sass_dir}/#{template}" if template.is_a? Symbol
    super(template, *args)
  end
end

set :sass_dir, '../assets'
Run Code Online (Sandbox Code Playgroud)