0

だから私はこの質問をしました:backbone.js + railsでビューをレンダリングする

人々が私を正しい方向に向けてくれたおかげで、答えに近づいたと感じています. 私の app/views/home/index.html.erb のコード:

<div id="container">Loading...</div>

<script type="text/javascript">
  $(function() {
    window.newView = new Example.Views.Users.NewView({model: users});
    //$('body').html(newView.render().$el)
    console.log(newView.render().$el)
    //newView.render();
    Backbone.history.start();
  });
</script>

このページを読み込もうとした後に firebug コンソールを調べると、次のエラーが表示されます。

ReferenceError: users is not defined
[Break On This Error]   

window.newView = new Example.Views.Users.NewView({model: users});

関連するコードの残りの部分は次のとおりです。

assets/javascripts/backbone/views/users/new_view.js.coffee

Example.Views.Users ||= {}

class Example.Views.Users.NewView extends Backbone.View
  template: JST["backbone/templates/users/new"]

  events:
    "submit #new-user": "save"

  constructor: (options) ->
    super(options)
    @model = new @collection.model()

    @model.bind("change:errors", () =>
      this.render()
    )

  save: (e) ->
    e.preventDefault()
    e.stopPropagation()

    @model.unset("errors")

    @collection.create(@model.toJSON(),
      success: (user) =>
        @model = user
        window.location.hash = "/#{@model.id}"

      error: (user, jqXHR) =>
        @model.set({errors: $.parseJSON(jqXHR.responseText)})
    )

  render: ->
    $(@el).html(@template(@model.toJSON() ))

    this.$("form").backboneLink(@model)

    return this

users_router.js.coffee

class Example.Routers.UsersRouter extends Backbone.Router
  initialize: (options) ->
    @users = new Example.Collections.UsersCollection()
    @users.reset options.users

  routes:
    "new"      : "newUser"
    "index"    : "index"
    ":id/edit" : "edit"
    ":id"      : "show"
    ".*"        : "index"

  newUser: ->
    @view = new Example.Views.Users.NewView(collection: @users)
    $("#users").html(@view.render().el)

  index: ->
    @view = new Example.Views.Users.IndexView(users: @users)
    $("#users").html(@view.render().el)

  show: (id) ->
    user = @users.get(id)

    @view = new Example.Views.Users.ShowView(model: user)
    $("#users").html(@view.render().el)

  edit: (id) ->
    user = @users.get(id)

    @view = new Example.Views.Users.EditView(model: user)
    $("#users").html(@view.render().el)

古い質問へのコメントを見ると、私がどこから来たのか、そして私が何を試したのかがよくわかります。ありがとう!

アップデート

user.js.coffee

class Example.Models.User extends Backbone.Model
  paramRoot: 'user'

  defaults:
    name: null
    email: null

class Example.Collections.UsersCollection extends Backbone.Collection
  model: Example.Models.User
  url: '/users'
4

2 に答える 2

0

エラーが言ったように、ユーザーはで定義されていませんnew Example.Views.Users.NewView({model: users});

home_controller.rb には、次のようなものが必要です。

def index
  @users = User.all
end

アプリ/ビュー/ホーム/index.html.erb:

...
window.newView = new Example.Views.Users.NewView({model: <%= @users.to_json.html_safe -%>});
...

お役に立てれば!

于 2013-05-23T17:15:57.463 に答える
0

NewViewページが読み込まれる初期段階でオブジェクトを 作成しているようです。window.newView = new Example.Views.Users.NewView({model: users});NewView costructor に移動すると@collection、 のパラメーターを渡していないため、 が見つかりませんNewView

Rails のバックボーンの標準的な例に従って、ページの読み込み時にルーターを初期化し、バックボーンの履歴を開始する必要があります。正常に動作する Githubの例があります。それを見て、バックボーンのいくつかのドキュメントに従ってください。それを機能させたい場合は、置くことができますwindow.newView = new Example.Views.Users.NewView({model: users,collection: <CollectionObject>});

お役に立てれば!!!

于 2013-05-23T18:24:57.740 に答える