バックボーン (song.js と songCollection.js) のさまざまなフロント エンド モデルとコレクションを使用して、シングル ページ アプリケーションの保存機能を実行し、Rails の適切なバックエンド モデル (song.rb) に保存します。ユーザーがビートや小節などで構成された曲を作成した後、バックボーン ルートはユーザーをその曲を含む URL に移動させます。ページの先頭が更新されていません。
バックボーン (ルートまたはビューのいずれか)、メソッドまたは何かから呼び出して、最近作成された曲を含むすべての曲をデータベースから再取得するには、できれば URL の Rails 側を変更せずに ( #ハッシュ)?
Assets.js.erb 内にある App.songs 変数は、新しい曲が作成された後に Rails から更新されることに興味があります.....
私は gon gem の使用に反対しているわけではありませんが、使用した場合、どのように呼び出して更新するのでしょうか?
声に出して考える:
多分assests.js.erbで私はこれを持つことができました:
App.updateThis = function(appSongs) {
// then an ajax/pjax call to the Rails songs_controller.rb that returns newAllSongs
appSongs = { songs: newAllSongs }
return appSongs; // this would/should update the global variable
}
参照用ファイル:
アプリケーション.js:
require([
'MYAPPLICATION' // this gets passed in as 'Application'
], function(Application){
Application.initialize(App.songs);
});
MYAPPLICATION.js:
define([
'jquery',
'underscore',
'backbone',
'backbone/routers/router', // Request router.js
], function($, _, Backbone, Router){
var initialize = function(options){
window.router = Router.initialize(options);
}
return {
initialize: initialize
};
});
このファイルは、AssetsPipeline パスを画像とサウンドにパッケージ化し、レンダリング時にアプリケーションに渡すために使用されます 。
assets.js.erb :
App = {};
App.assets = {
// Returns an object containing all of asset pipeline's image paths.
// This hash is because Rails' Asset Pipeline bundles the routes to files
// per user session, then hands that to the user's session browser, for security.
// So we create in Ruby (erb = embedded ruby) a hash of the images to be accessed
// in the JS.
images: {
<% AssetsUtil.images.each do |img| %>
"<%= img %>" : "<%= asset_path(img) %>",
<% end %>
},
// Return a formatted URL for an asset.
path: function(name) {
// If the file is in our images object, pull the path from there.
if (this.images && this.images[name]) {
return this.images[name];
}
// Otherwise, create a generic asset path.
return '/assets/' + name;
}
};
App.songs = {
songs: <%= Song.all.to_json.html_safe %>
};
routes.js (レールのルートではなく、バックボーンのルート)
define([
.... require.js paths .....
], function($, _, Backbone, mainHomeView, beatSliderView, beatBarsView, componentsView, tempoSliderView, transportView, repButtonView, log, songsCollection, songsViewNew, songsViewIndex, songsViewShow, songsViewEdit){
var AppRouter = Backbone.Router.extend({
songs: {},
routes: {
'new' : 'newSong',
'index' : 'index',
':id/edit' : 'edit',
':id' : 'show',
'.*' : 'newSong'
},
newSong: function(){
var view = new songsViewNew({collection : this.songs});
/// A WHOLE BUNCH OF RENDERING....
},
index: function(){
console.log('bb routes index');
},
show: function(id){
var createdSong = this.songs.get(id);
var view = new songsViewShow(createdSong);
},
edit: function(id){
console.log('bb routes edit');
},
});
// Initialize the Router, with the options, where (options) is declared in MYAPPLCIATION.js
// and called from application.js
//
// (options) == 'assest.js.erb' => App.songs{ songs : <%= Song.all.to_json.html_safe %> }
// (options) == All the songs in the DB
var initialize = function(options){
var app_router = new AppRouter;
app_router.songs = new songsCollection();
app_router.songs.reset(options.songs);
name = '';
$('.component').each( function() {
name = name + $(this).attr('id') + '.';
$(this).children('.measure').each( function() {
name = name + $(this).attr('id') + '.';
$(this).children('.beat').each( function() {
name = name + $(this).attr('id') + '.';
});
});
log.sendLog([[1, "Component structure: "+name]]);
name = '';
});
Backbone.history.start();
return app_router;
};
return {
initialize: initialize
};
});
使用:
- レール3.2.2
- gem 'rails-backbone' 経由の backbone.js
- gem 'requirejs-rails' 経由の require.js