2013-05-07 36 views
0

我对ember.js比较陌生,而且仍然很痛苦地学习它。我正在使用ember-rails gem,并将Rails用作JSON API。ember.js - 无法提交表单数据

首先,我只是想建造的东西,会显示结果列表(在这种情况下,电子邮件)与增加新的能力。我有UI设置和功能,并且ember从Rails API中提取电子邮件列表。我可以点击邮件标题和它带我到完整的电子邮件等

我的问题是添加新记录。我设置了一个撰写电子邮件表单,但在重新安排路由器和控制器中的代码几天之后,我仍然无法添加新记录。我发现的每个例子似乎都提出了一种不同的交易方式,createRecords,.get('store'),.get('content'),然后通过某种行为来提交细节。他们都没有为我工作。下面是感觉最接近我有:

商店

App.Adapter = DS.RESTAdapter.extend 
    serializer: DS.RESTSerializer.extend 
    primaryKey: (type) -> '_id' 

App.Store = DS.Store.extend 
    revision: 11 
    adapter: 'App.Adapter' 

电子邮件模式

App.Email = DS.Model.extend 
    from: DS.attr('string') 
    to: DS.attr('string') 
    subject: DS.attr('string') 
    body: DS.attr('string') 
    created_at: DS.attr('string') 

撰写路线

App.ComposeRoute = Ember.Route.extend 
model:() -> 
    transaction = this.get('store').transaction() 
    email = transaction.createRecord(App.Email, {}) 
    return email 

events: { 
    save: (email) -> 
    email.get('store').transaction() 
} 

撰写模板(削减了部分的HTML)

<label class="control-label" for="to">To</label> 
    {{view Ember.TextField valueBinding="to" id="to" placeholder="Your friend" required="true"}} 
<label class="control-label" for="subject">Subject</label> 
    {{view Ember.TextField valueBinding="subject" id="subject" placeholder="What's it about?" required="true"}} 
<label class="control-label" for="notes">Your message</label> 
    {{view Ember.TextArea valueBinding="body" id="body" placeholder="Your message"}} 
<button class="btn btn-primary btn-large" {{action save this}}>Send email</button> 

Rails的emails_controller.rb

class EmailsController < ApplicationController 
    # GET /emails.json 
    def index 
    render json: Email.all 
    end 

    # GET /emails/1.json 
    def show 
    email = Email.find(params[:id]) 
    render json: email 
    end 

    # POST /emails.json 
    def create 
    email = Email.new(params[:email]) 
    email.save 
    render json: email, status: :created 
    end 

因此,与上面的代码我填写文本框,点击提交按钮,但是没有一样即将发生。但是,如果我回到我的收件箱页面,我可以看到刚刚添加的记录(woohoo!),但它不会通过Rails(hrmmm)持久保存 - 只要我刷新它就消失了。看着Rails日志,ember似乎并没有向Rails发送任何东西。

我觉得我兜兜转转只是试图从不同的博客文章不同的线路并没有真正理解的基本过程。我应该怎么做?我已经阅读了Ember文档,并解释了基本概念,但使用RESTAdapter的工作示例非常少。

回答

1

你保存你的记录的方式仍然不正确。

您为您的电子邮件新的事务,这是您要提交该事务,而不是商店的一个。

App.ComposeRoute = Ember.Route.extend 
model:() -> 
    transaction = this.get('store').transaction() 
    email = transaction.createRecord(App.Email, {}) 
    return email 

events: { 
    save: (email) -> 
    // email.get('store').transaction() //This is only creating a new transaction 
    // @get('store.defaultTransaction').commit() // this is committing the store's transaction 
    email.get('transaction').commit() 
} 
+0

谢谢 - 这是有道理的,我终于有东西被发送到Rails!我收到了另一个错误:'未捕获的错误:断言失败:您的服务器返回了一个带有_id键的哈希,但是您没有映射。“我们正在使用mongodb;我以为我已经在商店中用'PrimaryKey:(type) - >'_id''对这个问题进行了排序。 – 2013-05-07 14:55:58

+0

很酷。我的猜测是你的JSON格式不符合'RESTAdapter'的要求。您可能会错过根{_id:'}而不是{email:{_id:1}} – 2013-05-07 15:00:47

2

您从未在代码中的任何地方调用过commit。请记住,store.transaction()只给你交易的实例,但你还是要commit(或rollbackRoute#deactivate,如果用户离开这条路线)。你可能想要这样做你的路线有点像这样:

App.ComposeRoute = Ember.Route.extend 
    model: -> 
    transaction = this.get('store').transaction() 
    transaction.createRecord(App.Email, {}) 

    deactivate: -> 
    ## not super sure about modelFor in this case, but I think it should work 
    record = @modelFor('email') 
    ## There's more to check here, like is record 'inflight' and all 
    ## but you get the idea. 
    if ((record.get('isNew')) or (record.get('isDirty'))) 
     @get('store.defaultTransaction').rollback() 

    events: { 
    save: (email) -> 
     @get('store.defaultTransaction').commit() 
     ## or @get('store').commit() 
    } 
+0

糟糕 - 我确实在上面的代码中错过了它,但是尝试了不同的方式来调用commit()。我改变了Route来匹配你的例子,我得到了'Uncaught TypeError:无法为@modelFor('email')行调用未定义的方法'get' - 我的路由不是嵌套的,只是this.routes列表此时此刻。由于用户界面不以这种方式嵌套,我认为这是要走的路? – 2013-05-07 14:07:03

+0

基本上你需要找出你在'model'中创建的记录是否仍然很脏。您可以将一个标志作为计算属性公开,或者您可以尝试访问要检查的记录。因此,不是'modelFor',而是尝试'record = @get('controller.content')'。 – MilkyWayJoe 2013-05-07 14:13:45

+0

谢谢 - 这很有道理。我按照你的建议改变了它,并且摆脱了错误,但是仍然没有任何东西被发送到Rails。新电子邮件显示在收件箱视图中,但刷新后不见了。 – 2013-05-07 14:36:39