1

我有一个带有 Backbone.js 前端的 rails 应用程序。在我的主干模型/集合定义中,我有以下模型(在 project.js.coffee.erb 中)

#############################
##  MODEL
#############################
class window.Project extends Backbone.Model

  urlRoot: '/projects'

#############################
##  COLLECTION
#############################
class window.Projects extends Backbone.Collection

  model: Project

  url: '/projects'


# initialize new collection
window.projects = new Projects
projects.reset(<%= Project.all.to_json %>)

最后一行是 ERB 在 JSON 中加载所有项目的地方。

当我加载我的应用程序时,这种引导会产生一个包含旧数据的集合。我知道它已经过时了,因为我已经做到了:

  • 删除我的开发数据库(sqlite3)
  • 更改我的 database.yml 以重命名我的开发数据库名称
  • 重新运行rake db:migrate以创建一个全新的 .sqlite3 数据库文件

我可以运行sqlite3并看到项目表不包含任何行,但是,即使在重新启动服务器之后,project.js它也会被编译为包含一个充满现在不存在的数据的集合。

Rails 在我运行时正确启动到开发模式rails s

=> Booting WEBrick
=> Rails 3.2.5 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-07-02 21:24:08] INFO  WEBrick 1.3.1
[2012-07-02 21:24:08] INFO  ruby 1.9.3 (2012-04-20) [x86_64-darwin11.4.0]
[2012-07-02 21:24:08] INFO  WEBrick::HTTPServer#start: pid=11607 port=3000

如果我创建项目,它们甚至会保存到数据库中。它们也可以很好地添加到 Backbone 集合中。但是,同样,如果我重新加载页面甚至重新启动服务器,该集合将再次填充旧数据。

有人可以帮我弄清楚我在这里做错了什么吗?

4

1 回答 1

1

好吧,事实证明我知道发生了什么。

只要文件本身不改变,rails 中的资源就会被缓存。所以一旦project.js.coffee.erb被编译成project.js,被引导到集合中的数据将保持静态,直到我对 进行更改project.js.coffee.erb,此时 rails 将重新编译文件,然后才从数据库中重新获取数据。

我意识到,如果我希望在每个页面加载时将新数据引导到集合中,我需要将projects.reset()javascript 添加为 main 中的内联脚本app/views/layouts/application.html.haml。将此代码添加到我的body标签末尾就可以了。

:javascript
  projects.reset(#{Project.all.to_json})
  groups.reset(#{Group.all.to_json})
  users.reset(#{User.all.to_json})

现在,每次重新加载页面时,当前数据都会加载到适当的集合中。

于 2012-07-03T02:17:23.993 回答