0

这是一个关于通过 Backbone 在 Rails 应用程序中创建数据库条目的长问题。我对如何处理 Rails 控制器中的数据以及如何在骨干网中设置 url 有疑问。

我在 Rails 中创建了一个包含标题、文本和关键字列的 Docs 表,让 Rails 自动创建 id 列。我尝试在控制台中创建两个文档,d7 和 d8。

在 d7 中,我尝试手动设置 id 和标题。当我尝试“保存”它时,它给了我一个 500 错误。

在 d8 中,我制作了一个只有标题的文档。当我尝试保存它时,它给了我一个 404 错误。

使用手动设置的 id 和标题创建文档 (d7)

d7 = new Doc({ id: '007', title: 'Document 7'})
Doc Constructor french2.js:24
child

尝试保存 d7 会产生 500 错误

d7.save({}, { success : function(rec) {console.log('saved : ', rec); } })

    PUT http://localhost:3000/docs/007 500 (Internal Server Error) jquery.js:8215
    XHR finished loading: "http://localhost:3000/docs/007". jquery.js:8215
    Object {readyState: 4, responseText: "<!DOCTYPE html>↵&lt;html lang="en">↵&lt;head>↵  <meta ch…ders</b>: <pre>None</pre></p>↵↵↵↵</body>↵&lt;/html>↵", status: 500, statusText: "Internal Server Error"}

它还在 DocsController#update 未定义方法 'stringify_keys' 中添加了“NoMethodError”

创建一个只有标题,没有 id 的文档(d8)(Rails 手动设置 id)

d8 = new Doc({title: 'Document 8'})
Doc Constructor french2.js:24
child

尝试在没有手动设置 id 的情况下保存文档会产生 404 错误

Object
POST http://localhost:3000/docs/undefined 404 (Not Found) jquery.js:8215
XHR finished loading: "http://localhost:3000/docs/undefined". jquery.js:8215
Object {readyState: 4, responseText: "<!DOCTYPE html>↵&lt;html lang="en">↵&lt;head>↵  <meta ch…ation on available routes.↵&lt;/p>↵↵</body>↵&lt;/html>↵", status: 404, statusText: "Not Found"}

4个问题:

1) 是否在 Backbone Doc 模型中正确设置了 url,以便使用 Rails 资源。 this.url = "docs/" + this.id 有关完整代码,请参阅下面的文档模型。

2) 我应该调用 save d7.save()来创建文档吗?我注意到它触发了 Rails 文档控制器中的更新操作?

3) 如何在不出现字符串化键错误的情况下保存字符串?

4) Rails 控制器:我的 docs 表有 3 个字段(标题、关键字、文本)以及 rails 添加的任何内容。我是否必须通过参数中的列名明确识别每个字段(即 params[:title][:keywords])还是下面的代码(我从其他人那里复制)是否正确,其中仅指定了符号 :doc ? 参数的名称是任意的吗?

     def create
        respond_with Doc.create(params[:doc])
     end 
     def update
       respond_with Doc.create(params[:id], params[:doc])
     end 

代码

部分模型代码的 url 设置为this.url = "docs/" + this.id

  window.Doc = Backbone.Model.extend({

        initialize : function Doc() {

          this.url = "docs/" + this.id   #not sure if this is correct

            this.bind("error", function(model, error){
                console.log( error );
            });

        },

url 设置为“docs”的集合

window.Docs = Backbone.Collection.extend({
            model : Doc,

            url: "docs",


            initialize : function() {
                console.log('Docs collection Constructor');
            }
        });

Rails 文档控制器

class DocsController < ApplicationController

  respond_to :json

    def index
        respond_with Doc.all
    end 

    def show
        respond_with Doc.find(params[:id])

    end 

    def create
        respond_with Doc.create(params[:doc])
    end 

    def update
        respond_with Doc.create(params[:id], params[:doc])
    end 

    def destroy
        respond_with Doc
    end    

end

文档表

class CreateDocs < ActiveRecord::Migration
  def change
    create_table :docs do |t|
      t.string :title
      t.string :text
      t.string :keywords

      t.timestamps
    end
  end
end

创建了一些种子数据,但只设置了标题。Rails 自动设置 id,但我可以手动设置吗?

Doc.create!(title: "doc 1")
Doc.create!(title: "doc 2")
4

1 回答 1

0

至于模型上的 url 属性,为了直接保存在模型上(而不是通过 Collection.create),您必须检查它是新条目还是更新。此代码对 url 属性执行此操作,它允许您调用 obj.save() 进行创建和更新。

 url : function() {
  var base = 'documents';
  if (this.isNew()) return base;
  return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + this.id;
}

对于 Rails 控制器,只需执行此操作就足够了

def create
    respond_with Document.create(params[:doc])
end 
于 2013-01-09T01:02:19.803 回答