0

我正在学习Ember.js,我正在尝试将它集成到Rails应用程序(普通应用程序,只是为了玩),因为大部分时间我都在使用 Rails。到目前为止一切顺利,我设法安装了它(我正在使用ember-rails),但我遇到了一个小问题,似乎我无法弄清楚,即使我看过(我想)关于 Ember 和 Rails 的每个教程。

所以,问题是我不能让路由器将任何类型的数据传递给视图/模板。我什至在其中硬编码了一个 JSON 对象(而不依赖于适配器)以查看它是否有效,但没有成功。所以,我的代码如下所示:

轨道宝石文件Gemfile

ruby "1.9.3"

gem 'rails', '3.2.16'
gem 'sqlite3'
gem 'jquery-rails'
gem 'ember-rails'
gem 'ember-source'
gem 'pg'

group :assets do
  gem 'sass-rails',   '~> 3.2.3'
  gem 'coffee-rails', '~> 3.2.1'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '>= 1.0.3'
end

导轨控制器app/controllers/users_controller.rb

class UsersController < ApplicationController
  def index
    @a_users = User.all

    respond_to do |format|
      format.html
      format.json {render :json => @a_users}
    end
  end
end

导轨型号app/models/users.rb

class User < ActiveRecord::Base
  validates :first_name, :presence => true
  validates :last_name, :presence => true
end

Rails 序列化器app/serializers/user_serializer.rb

class UserSerializer < ActiveModel::Serializer
  attributes :first_name, :last_name
end

铁路路线config/routes.rb

NewEmberOnRails::Application.routes.draw do
  root :to => 'home#index'
  resources :users
end

这几乎涵盖了 Rails 部分。如果我去访问,localhost:3000/users.json我会得到一个格式很好的 JSON 对象(假设我在数据库中有一个 John Doe 用户): {"users":[{"first_name":"John","last_name":"Doe"}]}

Ember.js 部分,我写如下:

灰烬商店app/assets/javascripts/store.js

NewEmberOnRails.Store = DS.Store.extend({
  // Override the default adapter with the `DS.ActiveModelAdapter` which
  // is built to work nicely with the ActiveModel::Serializers gem.
  adapter: DS.ActiveModelAdapter
  // revision: 11,
  // url: 'http://localhost:3000'
});

revision我什至玩过url但没有。

Ember 路由器app/assets/javascripts/router.js

NewEmberOnRails.Router.map(function() {
  return this.resource('users');
});

余烬路线app/assets/javascripts/route.rb

NewEmberOnRails.UsersRoute = Ember.Route.extend({
  model: function() {
    // return this.get('store').find('user');
    return {users: [{
      first_name: "John",
      last_name: "Doe"
    }, {
      first_name: "Big",
      last_name: "Bang"
    }]};
  }
});

如您所见,我在这里评论了商店,并在这里返回了一个硬编码的对象,但什么也没有。

灰烬控制器app/assets/javascripts/controller/users.js

NewEmberOnRails.usersController = Ember.Controller.extend({
  resourceType: NewEmberOnRails.User
});

余烬模型app/assets/javascripts/model/user.js

var attr = DS.attr;

NewEmberOnRails.User = DS.Model.extend(
  first_name = attr(),
  last_name = attr()
);

最后,视图、Rails 和 Ember 在一起(我想我在这里做错了,但我不知道是什么):

Rails 用户视图app/views/users/index.html.erb

<h1>Users</h1>

<script type="text/x-handlebars">
  {{ view NewEmberOnRails.ListUsersView }}
</script>

所以,这是调用 Ember 视图,这里是 ( app/assets/javascripts/views/users/list.js):

NewEmberOnRails.ListUsersView = Ember.View.extend({
  templateName: 'users/users',
  usersBinding: 'NewEmberOnRails.usersController'
});

那就是在users这里使用模板(app/assets/javascripts/template/users/users.handlebars):

{{#each users}}
  {{view NewEmberOnRails.ShowUserView userBinding="this"}}
{{else}}
  No users!
{{/each}}

现在,在ShowUserView我有(app/assets/javascripts/views/users/show.js):

NewEmberOnRails.ShowUserView = Ember.View.extend({
  templateName: 'users/show'
});

并且正在渲染这个模板 ( app/assets/javascripts/templates/users/show.handlebars)

First Name: {{user.first_name}}

所以,总结一切......当我访问时,localhost:3000/users我只得到No users!,女巫引导我两种可能性:

  1. users我在遍历它时没有任何数组app/assets/javascripts/template/users/users.handlebars
  2. 我有它,但它是空的,所以路线和我的视图/模板之间存在问题。

有人知道吗?

4

1 回答 1

0

当然,你可以随心所欲地做,但如果是我的,我会让我的路线返回一个数组并让我的控制器扩展ArrayController。看起来更简单,并且将匹配您真正将从商店获得的东西(集合User)。除非您真的想返回包含数组的单个对象,否则这与“正常”Ember Data 用法相反——

在 中的代码中NewEmberOnRails.UsersRoute,您已将 注释掉store.find并将其替换为不同的东西......试试这个:

NewEmberOnRails.UsersRoute = Ember.Route.extend({
  model: function() {
    // return this.get('store').find('user');
    return [{
      first_name: "John",
      last_name: "Doe"
    }, {
      first_name: "Big",
      last_name: "Bang"
    }];
  }
});

和:

NewEmberOnRails.usersController = Ember.ArrayController.extend({
    resourceType: NewEmberOnRails.User
});
于 2014-01-13T02:25:03.413 回答