如何创建与 Ember.js 和 Rails 关联的 belongsTo 记录?

Posted

技术标签:

【中文标题】如何创建与 Ember.js 和 Rails 关联的 belongsTo 记录?【英文标题】:How to createRecord with belongsTo association with Ember.js & Rails? 【发布时间】:2012-08-18 21:34:55 【问题描述】:

我在使用 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>

【问题讨论】:

【参考方案1】:

submit 函数中,project.client 被分配了一个 id 而不是DA.Client 实例。 如果DA.Client 实例应该预先存在,您可以使用DA.store.find(DA.Client, @get('client_id')) 获得它。

【讨论】:

【参考方案2】:

请注意,根据您绑定对象的方式,您可以选择与您正在创建的对象关联的对象,当您只希望获得 ID 时,Ember 可能会自动为您提供对象。例如使用 Ember.Forms.Select 视图绑定,本例中 client_id 的值将是实际的 Client 对象实例,而不仅仅是 ID。

如果您随后在 App.store.find() 调用中盲目地使用此对象,您将返回一个永远不会实现的 promise 对象,其 ID 设置为原始对象的序列化。如果您随后尝试提交此操作,它将尝试坚持以下内容:

"field_id":"<App.Type:ember123:1>"

【讨论】:

以上是关于如何创建与 Ember.js 和 Rails 关联的 belongsTo 记录?的主要内容,如果未能解决你的问题,请参考以下文章

Ember.js + Leaflet + rails(使用 Javascript MVC 创建 Rails 应用程序并打开源地图)

Ember.JS && Coffeescript

如何使用 Ember.js 和 ember-data 创建新记录?

如何为 ember.js 创建自定义适配器?

Ember.js 中的视图与组件

Rails 6:通过网络抓取控制器操作创建帖子时如何将用户与创建的帖子相关联