我在sinatra中正确加载脚本吗?

时间:2012-10-20 05:23:44

标签: ruby sinatra datamapper

我之前从未在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>

我在公共文件夹/ p​​ublic / 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的加载?

1 个答案:

答案 0 :(得分:0)

DataMapper.auto_migrate!删除现有表格,如果它们存在并再次创建它们。

所以调用此函数意味着:您丢失了所有数据。 (这就是为什么最后会有一个惊叹号,这意味着:小心!)如果您的架构仍在大量开发中,我建议您将DataMapper.auto_migrate!替换为DataMapper.auto_upgrade!。它不会擦除旧数据,而是在尝试保留数据时尝试修改基础表。感叹号仍然存在,因为您的数据可能仍会受到轻微损坏,因为在不破坏数据的情况下更改架构并非总是可行。

另一方面,必须改变呼叫的顺序。目前它是:

  1. 模型定义
  2. DataMapper.Setup
  3. DataMapper.auto_migrate!
  4. 您的路线定义等。
  5. 但它应该是:

    1. DataMapper.Setup
    2. 模型定义
    3. DataMapper.auto_migrate! DataMapper.auto_upgrade!
    4. DataMapper.finalize(你忘了那个)
    5. 您的路线定义等。
    6. 当使用datamapper弄乱某些内容时,错误消息可能会很奇怪/误导。顺便说一下,确保从视图中对数据库进行 no 调用。这些调用属于控制器,在我看来没有任何例外。这样你的应用程序自然遵循MVC模式。 (毕竟Sinatra很难执行任何其他结构......;))