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と、projectsテーブルに行が含まれていないことがわかりますが、サーバーを再起動した後でも、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 に答える