2013-05-07 55 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