Как создать запись с ассоциацией ownTo с Ember.js и Rails?

У меня проблемы с ассоциацией ownTo и отправкой внешнего ключа на мой контроллер Rails с Ember.js и ember-data. Мой контроллер 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>

person David    schedule 18.08.2012    source источник


Ответы (2)


В функции submit project.client присваивается идентификатор вместо экземпляра DA.Client. Если предполагается, что экземпляр DA.Client уже существует, вы можете получить его с помощью DA.store.find(DA.Client, @get('client_id')).

person Stéphane Blond    schedule 20.08.2012

Имейте в виду, что в зависимости от того, как вы привязываете вещь, которая позволяет вам выбирать объект для связи с создаваемым вами объектом, Ember может автоматически предоставить вам объект, когда вы ожидаете только получить идентификатор. Например, при использовании привязки представления Ember.Forms.Select значение client_id в этом примере будет фактическим экземпляром объекта Client, а не просто идентификатором.

Если вы затем слепо используете этот объект в вызове App.store.find(), вы получите обратно обещанный объект, который никогда не будет выполнен, с идентификатором, установленным как сериализация исходного объекта. Если вы затем попытаетесь зафиксировать это, он попытается сохранить что-то вроде:

"field_id":"<App.Type:ember123:1>"
person Pascal Zajac    schedule 29.12.2012