我之前从未在sinatra做过任何事情,并决定尝试一个项目。我对脚本加载如何工作感到困惑。它似乎间歇性地工作。有时2个脚本/ css文件会出现内部服务器错误,有时它们都会出错。
这是我的layout.erb:
<!doctype html>
<html>
<head>
<title>An HTML5 box of sand</title>
<meta charset="utf-8" />
<link href='http://fonts.googleapis.com/css?family=Arvo' rel='stylesheet' type='text/css'>
<link rel="stylesheet/less" type="text/css" href="/assets/stylesheets/style.less">
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script><!--loads jquery-->
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script><!--loads jquery ui-->
<script type="text/javascript" src="/assets/js/lib/handlebars.js"></script>
<script src="/assets/js/lib/less-1.3.0.min.js" type="text/javascript"></script>
<script type="text/javascript" src="/assets/js/script.js"></script><!--This is the place where you play!!!-->
</head>
<body>
<%= yield %>
</body>
</html>
我在公共文件夹/ public / assets中有assets文件夹。这很奇怪,因为有时它会加载assets / js / script.js文件,而不会加载把手文件。其他时候它会加载把手而不是script.js文件。我不确定发生了什么。
~~~~~~~~~~~~~~~~~ UPDATE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~
发现了问题,但不知道如何修复它。
所以,似乎因为我使用数据映射器auto_migrate!方法在某种程度上搞砸了资产的加载方式。我能做些什么吗?这是我在app.rb文件中的内容:
require 'rubygems'
require 'sinatra'
require 'data_mapper'
# Include the models
require './models/User'
# Connect to mysql
DataMapper.setup(:default, "mysql://root@localhost/dev_landing")
#This line is what is messing everything up.
DataMapper.auto_migrate!
set :public_folder, 'public'
get '/' do
erb :home
end
我设置了这样的数据映射器,因为我在教程中读到了这是如何让它自动创建您在模型中指定的表。有没有更好的方法来做到这一点,以便它不会搞砸我的scritps和CSS的加载?
答案 0 :(得分:0)
DataMapper.auto_migrate!
删除现有表格,如果它们存在并再次创建它们。
所以调用此函数意味着:您丢失了所有数据。 (这就是为什么最后会有一个惊叹号,这意味着:小心!)如果您的架构仍在大量开发中,我建议您将DataMapper.auto_migrate!
替换为DataMapper.auto_upgrade!
。它不会擦除旧数据,而是在尝试保留数据时尝试修改基础表。感叹号仍然存在,因为您的数据可能仍会受到轻微损坏,因为在不破坏数据的情况下更改架构并非总是可行。
另一方面,必须改变呼叫的顺序。目前它是:
DataMapper.Setup
DataMapper.auto_migrate!
但它应该是:
DataMapper.Setup
DataMapper.auto_upgrade!
DataMapper.finalize
(你忘了那个)当使用datamapper弄乱某些内容时,错误消息可能会很奇怪/误导。顺便说一下,确保从视图中对数据库进行 no 调用。这些调用属于控制器,在我看来没有任何例外。这样你的应用程序自然遵循MVC模式。 (毕竟Sinatra很难执行任何其他结构......;))