许多与Ember,ember-data和Rails的关系 [英] Many to Many Relationships with Ember, ember-data and 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
/ pre>
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'
现在您可以使用
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()
anddeleteRecord()
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屋!