与Ember, Ember语言 - data和Rails的多对多关系



我遇到了一个问题,试图使用ember-data和rails在Ember.js中保存多对多关系。关联在余烬方面工作得很好,但是当我尝试提交事务时,它将不包括提交到rails时的新关联列表。任何帮助都将非常感激,我一直在撕扯我的头发试图找到一个例子应用程序,在github上做一些这么简单的事情,但我似乎找不到一个。

这是我的Ember代码的简化版本:

App.Store = DS.Store.extend
  revision: 11
  adapter: DS.RESTAdapter.create
    url: '/api'
App.Router.map ->
  @resource 'rosters'
  @resource 'users'
App.User = DS.Model.extend
  rosters: DS.hasMany 'App.Roster'
App.Roster = DS.Model.extend
  users: DS.hasMany 'App.User'
App.RostersEditRoute = Ember.Route.extend
  setupController: (controller, model) ->
    controller.set 'users_list', App.User.find()
App.RostersEditView = Ember.View.extend
  userCheckbox: Em.Checkbox.extend
    checkedObserver: ( ->
      users = @get 'roster.users'
      if @get 'checked'
        users.addObject @get 'user'
      else
        users.removeObject @get 'user'
      @get('controller.store').commit()
    ).observes 'checked'

编辑表单:

each user in users_list
  label.checkbox
    view view.userCheckbox rosterBinding="current_roster" userBinding="user" | #{user.full_name}

Rails后端(使用继承资源和活动模型序列化器宝石):

class User < ActiveRecord::Base
  has_many :rosters_users
  has_many :rosters, through: :rosters_users
  accepts_nested_attributes_for :rosters
end
class RostersUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :roster
end
class Roster < ActiveRecord::Base
  has_many :rosters_users
  has_many :users, through: :rosters_users
  accepts_nested_attributes_for :users
end
module Api
  class RostersController < BaseController
  end
end
module Api
  class UsersController < BaseController
  end
end
module Api
  class BaseController < ActionController::Base
    inherit_resources
    respond_to :json
    before_filter :default_json
    protected
    # Force JSON
    def default_json
      request.format = :json if params[:format].nil?
    end
  end
end
class UserSerializer < BaseSerializer
  has_many :rosters, embed: :ids
end
class RosterSerializer < BaseSerializer
  has_many :users, embed: :ids
end

就像我说的,关联在Ember上工作得很好,但rails似乎没有得到新的关联数据。当我在web检查器中检查XHR选项卡时,我看到它只发送了这个:

请求负载{"名单":{"created_at":"星期四,格林尼治时间2013年3月21日23:16:02"、"team_id":"1"}}

返回204 no content错误,因为没有更改任何内容。

尽管可以建立匹配的hasMany关系,但Ember Data实际上还不支持多对多关系(参见此问题)。现在可以做的是使用成员关系模型分解关系。

App.User = DS.Model.extend
  rosterMemberships: DS.hasMany 'App.RosterMembership'      
App.RosterMembership = DS.Model.extend
  user: DS.belongsTo 'App.User'
  roster: DS.belongsTo 'App.Roster'
App.Roster = DS.Model.extend
  rosterMemberships: DS.hasMany 'App.RosterMembership'

现在您可以使用createRecord()deleteRecord()与成员关系模型来添加和删除关系。

不幸的是,在本例中,绑定到特定用户的花名册集合不是那么容易。一种变通方法如下:

App.User = DS.Model.extend
  rosterMemberships: DS.hasMany 'App.RosterMembership'
  rosters: ( ->
    @get('rosterMemberships').getEach('user')
  ).property 'rosterMemberships.@each.relationshipsLoaded'
App.RosterMembership = DS.Model.extend
  user: DS.belongsTo 'App.User'
  roster: DS.belongsTo 'App.Roster'
  relationshipsLoaded: ( ->
    @get('user.isLoaded') and @get('roster.isLoaded')
  ).property 'user.isLoaded', 'roster.isLoaded'

如果您绑定到user.rosters,那么您的模板应该在关系创建或销毁时更新。

备选方案:

App.Roster = DS.Model.extend
  users_map: DS.attr('array')
  users: DS.hasMany 'App.User'
  users_change: (->
    @set('users_map', @get('users').map((el) -> el.id).toArray())
  ).observes('users.@each')

在POST数据中将发送用户id数组

最新更新