4

私はbelongsToアソシエーションに問題があり、Ember.jsとember-dataを使用して外部キーをRailsコントローラーに送信しています。私のEmber.jsコントローラーはプロジェクト名をRailsコントローラーに送信しますが、client_id値は送信しません。Railsコントローラーでは、params [:project] [:client_id]はnilとして送信されます。

ヘルプ!どこが間違っているのですか?

モデル:

DA.Project = DS.Model.extend
  name: DS.attr('string')
  client: DS.belongsTo('DA.Client')

DA.Client = DS.Model.extend
  name: DS.attr('string')
  projects: DS.hasMany('DA.Project')

コントローラ:

DA.ProjectsController = Em.ArrayController.extend  
  createProject: (project) ->
    @transaction = DA.store.transaction()
    p = @transaction.createRecord(DA.Project, project)
    validation_errors = p.validate()

    if validation_errors
      DA.displayError validation_errors
    else
      @transaction.commit()

意見:

DA.ProjectsNew = Em.View.extend
  tagName: 'form'
  templateName: 'projects/new'

  init: ->
    @_super()

  didInsertElement: ->
    @_super()

  submit: (event) ->
    event.preventDefault()
    project = {}
    project.name = @get('name')
    project.client = @get('client_id')

    DA.ProjectsController.createProject(project)

レンプレート:

{{view Em.TextField valueBinding="view.name" placeholder="Project Name" tabindex="1"}}
{{view Em.TextField valueBinding="view.client_id" placeholder="Client ID" tabindex="2"}}
<button type="submit">Create</button>
4

2 に答える 2

3

submit関数では、インスタンスproject.clientの代わりにIDが割り当てられます。インスタンスがすでに存在することになっている場合は、で取得できDA.Clientます。DA.ClientDA.store.find(DA.Client, @get('client_id'))

于 2012-08-20T09:25:58.563 に答える
2

作成しているオブジェクトに関連付けるオブジェクトを選択できるものをバインドする方法によっては、IDを取得することだけを期待している場合に、Emberが自動的にオブジェクトを提供する場合があることに注意してください。たとえば、Ember.Forms.Selectビューバインディングを使用すると、この例のclient_idの値は、IDだけでなく、実際のClientオブジェクトインスタンスになります。

その後、App.store.find()呼び出しでこのオブジェクトを盲目的に使用すると、元のオブジェクトのシリアル化としてIDが設定された、決して実行されないpromiseオブジェクトが返されます。次にこれをコミットしようとすると、次のようなものを永続化しようとします。

"field_id":"<App.Type:ember123:1>"
于 2012-12-29T10:23:54.780 に答える