查看Sinatra中的特定样式表(通过命名约定)

时间:2010-08-20 12:46:07

标签: ruby sinatra

我想让我的Sinatra应用程序在布局中包含一个特定于视图的样式表。

考虑这个简单的应用程序:

app_folder_root/
| my_app/
|   my_app.rb
| public/
|   css/
|     index.css
|     layout.css
| views/
|   index.haml
|   layout.haml
config.ru

config.ru:

require 'rubygems'
require './my_app/my_app'

map '/' do
  run MyApp
end

app.rb:

require 'sinatra/base'

class MyApp < Sinatra::Base
  get '/' do
    haml :index
  end
end

我尝试在my_app.rb中设置一个变量来设置视图的名称,并尝试在layout.haml中引用它,但这不起作用(我可能不会将其作为一个问题的最终解决方案,因为我觉得这是一种代码味道,但只是尝试了不同的可能性。)

这是使用Haml,但我希望这是无关紧要的 - 认为它应该与erb等相同。

layout.haml中,我想引用将呈现的视图,并按命名约定包含视图特定的样式表。例如,如果要呈现index.haml,我想包含css/index.css。这样做的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我通过以下方式解决了这个问题:

index.haml(在顶部)我创建或附加了一个名为views的数组:

- @views = Array.new unless defined? @views
- @views << 'index'

layout.haml我引用@views

%head
  - @views.each do |view|
    - haml_tag :link, {:rel => 'stylesheet', :type => 'text/css', :href => "css/#{view}.css"}

我有点失望的是必须在视图中检查@views以确保在添加之前定义它,但是现在它是可管理的。

编辑:解决了必须检查每个视图中是否定义了@views的问题。在config.ru中添加以下内容:

before do
  @views = Array.new
end

我现在可以从视图中删除此行:

- @views = Array.new unless defined? @views