2

我以前从未在 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/js/script.js 文件,而不是加载把手文件。其他时候它会加载把手而不是 script.js 文件。我不确定发生了什么。

~~~~~~~~~~~~~~~~~更新~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~

发现了问题,但不知道如何解决。

所以,似乎是因为我正在使用数据映射器 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

我这样设置数据映射器是因为我在一个教程中读到,这就是你如何让它自动创建你在模型中指定的表。有没有更好的方法来做到这一点,这样它就不会弄乱我的脚本和 css 的加载?

4

1 回答 1

0

DataMapper.auto_migrate!删除现有表以防它们存在并再次创建它们。

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

另一件事,调用的顺序必须改变。目前是:

  1. 模型定义
  2. DataMapper.Setup
  3. DataMapper.auto_migrate!
  4. 您的路线定义等。

但它应该是:

  1. DataMapper.Setup
  2. 模型定义
  3. DataMapper.auto_migrate! DataMapper.auto_upgrade!
  4. DataMapper.finalize(你忘了那个)
  5. 您的路线定义等。

当数据映射器出现问题时,错误消息可能会很奇怪/具有误导性。顺便说一句,确保没有从您的视图内部调用数据库。这些调用属于控制器,我认为没有任何例外。这样,您的应用自然会遵循 MVC 模式。(毕竟 Sinatra 几乎没有强制执行任何其他结构......;))

于 2012-10-20T09:46:03.210 回答