ルート ページでビュー "new_view.js.coffee" (ユーザーを作成するフォーム) をレンダリングしようとしています。私は rails-backbone gem を使用しています。これまでのところ、次のようになっています。
アプリ/ビュー/ホーム/index.html.erb
<div id="container">Loading...</div>
<script type="text/javascript">
$(function() {
window.newView = new Example.Views.Users.NewView({model: users});
newView.render();
Backbone.history.start();
});
</script>
基本的にはこれのコピーです (rails-backbone README.md から):
アプリ/ビュー/投稿/index.html.erb
<div id="posts"></div>
<script type="text/javascript">
$(function() {
// Blog is the app name
window.router = new Example.Routers.PostsRouter({posts: <%= @posts.to_json.html_safe -%>});
Backbone.history.start();
});
私の新しい見解は次のとおりです。
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)
「新しい」テンプレート:
assets/javascripts/backbone/templates/users/new.jst.ejs
<h1>New user</h1>
<form id="new-user" name="user">
<div class="field">
<label for="name"> name:</label>
<input type="text" name="name" id="name" value="<%= name %>" >
</div>
<div class="field">
<label for="email"> email:</label>
<input type="text" name="email" id="email" value="<%= email %>" >
</div>
<div class="actions">
<input type="submit" value="Create User" />
</div>
</form>
<a href="#/index">Back</a>
localhost:3000 にアクセスすると、「読み込み中...」しか表示されません (アプリが起動するかどうかを確認するために入力しました)。繰り返しますが、上記の #container div で new_view をレンダリングするにはどうすればよいでしょうか?