7

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バックエンド(継承されたリソースとアクティブモデルのシリアライザーgemを使用):

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で正常に機能しますが、レールは新しい関連付けデータを取得していないようです。Webインスペクターの[XHR]タブを確認すると、次の情報のみが送信されていることがわかります。

ペイロードのリクエスト{"名簿":{"created_at":"2013年3月21日木曜日23:16:02GMT"、 "team_id": "1"}}

そして、何も変更されていないため、204nocontentエラーで返されます。

4

2 に答える 2

17

一致する関係を設定することは可能ですが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()

残念ながら、この例では、特定のユーザーの名簿のコレクションにバインドするのはそれほど簡単ではありません。1つの回避策は次のとおりです。

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、関係が作成または破棄されたときにテンプレートが更新されます。

于 2013-03-25T21:24:26.667 に答える
0

代替ソリューション:

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の配列を送信します

于 2013-10-18T18:00:14.617 に答える