私はこの「CloudEdit」バックボーン チュートリアルhttp://www.jamesyu.org/2011/01/27/cloudedit-a-backbone-js-tutorial-by-example/をいじっています。これにより、「タイトル」と「本文」のプロパティを持つ「ドキュメント」を作成できます。データを「ドキュメント」URL に保存する Rails バックエンドを使用し、EditView を介してドキュメントを作成/編集します。簡単に言うと、保存のたびに this.model.save() の EditView の成功コールバックがトリガーされ、ビューの console.log() メッセージが「タイトル」と「本文」プロパティは、フォームに入力された値で設定されます。データベースを確認すると、ほとんどのレコードでタイトルと本文が「null」になっていますが、実際に入力された値が含まれているレコードはごくわずかです。このパターンは、データベースで約 4/5 が null を表示することなく、さらにレコードを追加しようとしても続きます。以下のコードに基づいて、その理由がわかるでしょうか。
データベースは、タイトルと本文のプロパティがほとんどのレコードで null であることを示していることに注意してください。つまり、これはバックボーンがデータを適切に取得していないという問題ではありません。正しく保存されていません。 モデル
window.Document = Backbone.Model.extend({
url : function() {
var base = 'documents';
if (this.isNew()) return base;
return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
}
});
View var EditView = Backbone.View.extend({ events: { "フォームを送信": "保存" },
initialize: function() {
this.render();
},
save: function() {
var self = this;
var msg = this.model.isNew() ? 'Successfully created!' : "Saved!";
var tit = this.$('[name=title]').val();
console.log(tit);
var bod = this.$('[name=body]').val();
console.log(bod);
this.model.save({ title: this.$('[name=title]').val(), body: this.$('[name=body]').val() }, {
success: function(model, resp) {
// new App.Views.Notice({ message: msg });
console.log("save");
self.model = model;
self.delegateEvents();
},
error: function(r) {
console.log(r);
}
});
return false;
},
render: function() {
...template rendering code...
}
});
のコメントに応じて更新
これは、documents_controller.rb の create アクションです。
respond_to :json
...code ommitted...
def create
puts params
respond_with Document.create(:document => params[:document])
end
ただし、これは puts params が明らかにするものであり、保護された属性の一括割り当てに関する警告があります。ただし、「ドキュメント」はモデルの属性でさえありません。
Processing by DocumentsController#create as JSON
Parameters: {"title"=>"hop", "body"=>"hot", "document"=>{"title"=>"hop", "body"=>"hot"}}
WARNING: Can't mass-assign protected attributes: document
(0.1ms) begin transaction
SQL (80.4ms) INSERT INTO "documents" ("body", "created_at", "title", "updated_at") VALUES (?, ?, ?, ?) [["body", nil], ["created_at", Fri, 25 Jan 2013 23:20:51 UTC +00:00], ["title", nil], ["updated_at", Fri, 25 Jan 2013 23:20:51 UTC +00:00]]
(7.3ms) commit transaction
Completed 201 Created in 127ms (Views: 31.9ms | ActiveRecord: 0.0ms)
次のフォーム入力に基づいて、このような作成アクションを書き直しました
def create
respond_with Document.create(:title => params[:title], :body => params[:body])
end
#form input names
<input name='title' type='text'/>
<textarea name='body'>