在 Ruby 的 Cuba 框架中链接样式表
Linking a stylesheet in Ruby's Cuba framework
这看起来应该很简单,但我不知道如何在 Cuba
应用程序中将 link stylesheet
转换为 erb
模板。
hello_world.rb
require "cuba"
require "cuba/safe"
require "cuba/render"
require "erb"
Cuba.use Rack::Session::Cookie, :secret => "__a_very_long_string__"
Cuba.plugin Cuba::Safe
Cuba.plugin Cuba::Render
Cuba.define do
on root do
res.write view("home")
end
end
views/layout.erb
<!DOCTYPE html>
<html lang="en">
<head>
<link href="styles/basic.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div>
<h1>Hello</h1>
</div>
</body
</html>
config.ru
require "./hello_world"
run Cuba
styles/basic.css
h1 {
font-size: 128px;
}
div {
padding: 50px;
margin: 100px;
}
我曾尝试使用一些 Sinatra
标准,例如将我的 css
放在名为 public
的目录中以及使用 <link href="<%= url('styles/basic.css') %>" rel="stylesheet" type="text/css" />
,但没有任何效果。
古巴不提供静态资源。您可以为此使用 Rack::Static
:
# hellow_world.rb
Cuba.use Rack::Static,
root: "public",
urls: ["/javascripts", "/css", "/images"]
然后,在您的视图中引用此文件夹。
# layout.erb
<link href="/public/css/basic.css" rel="stylesheet" type="text/css" />
Cuba 应用程序是(薄)引擎盖下的 Rack 应用程序。
Rack 应用程序是任何可以响应#call 方法的object,产生一个带有状态代码的数组,一个带有headers 的散列和一个body。
Rack 中间件与应用程序基本相同。唯一的区别是它们在 request-response 周期中扮演的角色:
- 应用程序是请求链的最终目的地,也是将生成原始响应的应用程序。
- 另一方面,中间件位于客户端和应用程序之间,pre-processing 在到达应用程序之前请求,或者在应用程序生成它们之后 post-processing 响应。
当您 运行 您的应用程序时,您 运行 它与中间件堆栈一起。每个请求从客户端通过堆栈到达您的应用程序,然后它的响应从您的应用程序通过堆栈到达客户端。
Cuba 不会隐式添加任何中间件或端点来处理静态文件。这意味着如果一个请求没有被任何可以处理它的中间件拦截并到达您的应用程序,然后您的应用程序没有处理它的路由,它将得到 404。
与此相反,Sinatra 会为您隐式处理静态文件请求。
这就是为什么 运行宁
Cuba.use Rack::Static,
root: "public",
urls: ["/javascripts", "/css", "/images"]
解决了您的问题,因为它添加了一个中间件来响应在
中生成的请求
<link href="/public/css/basic.css" rel="stylesheet" type="text/css" />
在您的应用需要之前。
这看起来应该很简单,但我不知道如何在 Cuba
应用程序中将 link stylesheet
转换为 erb
模板。
hello_world.rb
require "cuba"
require "cuba/safe"
require "cuba/render"
require "erb"
Cuba.use Rack::Session::Cookie, :secret => "__a_very_long_string__"
Cuba.plugin Cuba::Safe
Cuba.plugin Cuba::Render
Cuba.define do
on root do
res.write view("home")
end
end
views/layout.erb
<!DOCTYPE html>
<html lang="en">
<head>
<link href="styles/basic.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div>
<h1>Hello</h1>
</div>
</body
</html>
config.ru
require "./hello_world"
run Cuba
styles/basic.css
h1 {
font-size: 128px;
}
div {
padding: 50px;
margin: 100px;
}
我曾尝试使用一些 Sinatra
标准,例如将我的 css
放在名为 public
的目录中以及使用 <link href="<%= url('styles/basic.css') %>" rel="stylesheet" type="text/css" />
,但没有任何效果。
古巴不提供静态资源。您可以为此使用 Rack::Static
:
# hellow_world.rb
Cuba.use Rack::Static,
root: "public",
urls: ["/javascripts", "/css", "/images"]
然后,在您的视图中引用此文件夹。
# layout.erb
<link href="/public/css/basic.css" rel="stylesheet" type="text/css" />
Cuba 应用程序是(薄)引擎盖下的 Rack 应用程序。
Rack 应用程序是任何可以响应#call 方法的object,产生一个带有状态代码的数组,一个带有headers 的散列和一个body。
Rack 中间件与应用程序基本相同。唯一的区别是它们在 request-response 周期中扮演的角色:
- 应用程序是请求链的最终目的地,也是将生成原始响应的应用程序。
- 另一方面,中间件位于客户端和应用程序之间,pre-processing 在到达应用程序之前请求,或者在应用程序生成它们之后 post-processing 响应。
当您 运行 您的应用程序时,您 运行 它与中间件堆栈一起。每个请求从客户端通过堆栈到达您的应用程序,然后它的响应从您的应用程序通过堆栈到达客户端。
Cuba 不会隐式添加任何中间件或端点来处理静态文件。这意味着如果一个请求没有被任何可以处理它的中间件拦截并到达您的应用程序,然后您的应用程序没有处理它的路由,它将得到 404。
与此相反,Sinatra 会为您隐式处理静态文件请求。
这就是为什么 运行宁
Cuba.use Rack::Static,
root: "public",
urls: ["/javascripts", "/css", "/images"]
解决了您的问题,因为它添加了一个中间件来响应在
中生成的请求<link href="/public/css/basic.css" rel="stylesheet" type="text/css" />
在您的应用需要之前。