我想让我的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
。这样做的最佳方法是什么?
答案 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