许多与Ember,ember-data和Rails的关系 [英] Many to Many Relationships with Ember, ember-data and Rails

查看:125
本文介绍了许多与Ember,ember-data和Rails的关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用ember-data和rails在Ember.js中保存多个关系。该协会在事情的一方面工作正常,但是当我尝试提交交易时,它不会在提交到rails时包含新的关联列表。任何帮助将不胜感激,我一直在撕裂我的头发试图找到一个例子应用程序,在github上做这个简单的东西,但我似乎找不到一个。



这是我的Ember代码的转储版本:

  App.Store = DS.Store.extend 
修订版:11
适配器: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
用户:DS.hasMany'App.User'

App.RostersEditRoute = Ember.Route.extend
setupController:(控制器,型号) - >
controller.set'users_list',App.User.find()

App.RostersEditView = Ember.View.extend
userCheckbox:Em.Checkbox.extend
checkedObserver:( - >
users = @get'roster.users'
如果@get'checked'
users.addObject @get'user'
else
users.removeObject @get'user'
@get('controller.store')。commit()
).observes'checked'

编辑表单:

  users_list中的每个用户
标签.checkbox
view view.userCheckbox rosterBinding =current_rosteruserBinding =user| #{user.full_name}

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

  class User< ActiveRecord :: Base 
has_many:rosters_users
has_many:rosters,through::rosters_users
acceptance_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
acceptable_nested_attributes_for:users
end

module Api
class RostersController BaseController
end
end

模块Api
class UsersController< BaseController
end
end

module Api
class BaseController< ActionController :: Base
inherit_resources

respond_to:json
before_filter:default_json

protected

#强制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选项卡时,我看到它只发送这个:



请求有效负载
{roster:{created_at Thu,2013年3月21日23:16:02 GMT,team_id:1}}



我返回的是204没有内容错误,因为没有

解决方案

尽管可以设置匹配的 hasMany 关系,Ember Data实际上并不支持许多关系(参见此问题)。现在可以做的是使用会员模型分解关系。

  App.User = DS.Model.extend 
rosterMemberships:DS.hasMany'App.RosterMembership'

App.RosterMembership = DS.Model.extend
用户:DS.belongsTo'App.User'
花名册:DS .belongsTo'App.Roster'

App.Roster = DS.Model.extend
rosterMemberships:DS.hasMany'App.RosterMembership'
/ pre>

现在您可以使用 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
用户:DS.belongsTo'App.User'
花名册:DS.belongsTo'App.Roster'
relationshipsLoaded :(( - >
@get('user.isLoaded')和@get('roster.isLoaded')
).property'user.isLoaded','roster.isLoaded'

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


I am having an issue with trying to save many to many relationships in Ember.js using ember-data and rails. The association works fine on the ember side of things, however when I try to commit the transaction it will not include the list of new associations when submitting to rails. Any help would be much appreciated, I've been tearing out my hair trying to find an example application that does something this simple on github but I can't seem to find one.

Here is a dumbed down version of my Ember code:

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'

Edit form:

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

Rails Backend (Using Inherited Resources and Active Model Serializer gems):

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

So like I said, the association works fine on Ember but rails doesn't seem to be getting the new association data. When I check out the XHR tab in the web inspector, I see it only sent this:

Request Payload {"roster":{"created_at":"Thu, 21 Mar 2013 23:16:02 GMT","team_id":"1"}}

And I am returned with a 204 no content error because nothing changed.

解决方案

Despite the fact that it's possible to set up matching hasMany relationships, Ember Data doesn't actually support many to many relationships yet (see this issue). What you can do for now is decompose the relationship using a membership model.

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'

Now you can use createRecord() and deleteRecord() with the membership model to add and delete relationships.

Unfortunately, in this example, it's not so easy to bind to the collection of rosters for a particular user. One work-around is as follows:

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'

If you bind to user.rosters, then your template should update when relationships are created or destroyed.

这篇关于许多与Ember,ember-data和Rails的关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆