0

私は ember.js に比較的慣れていないので、まだ学習に苦労しています。私は ember-rails gem と Rails を JSON API として使用しています。

最初に、新しいレコードを追加する機能を備えたレコード (この場合はメール) のリストを表示するものを作成したかっただけです。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()
}

Compose テンプレート(一部の 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 email_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

したがって、上記のコードを使用して、テキストボックスに入力し、送信ボタンをクリックしても、何も起こらないようです。しかし、Inbox ページに戻ると、追加したばかりのレコードが表示されます (woohoo!) が、Rails を介して永続化されていません (hrmmm) - 更新するとすぐに消えてしまいます。Rails のログを見ると、ember は Rails に何も送信していないようです。

基本的なプロセスを本当に理解せずに、さまざまなブログ投稿からさまざまな行を試すだけで、ぐるぐる回っているように感じます. これをどのように行う必要がありますか?Ember のドキュメントを読みましたが、基本的な概念は説明されていますが、RESTAdapter を使用した実用的な例はほとんどありません。

4

2 に答える 2

2

commitコードのどこにも呼び出されていません。store.transaction()はトランザクションのインスタンスのみを提供することcommitに注意rollbackしてくださいRoute#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()
  }
于 2013-05-07T13:40:29.407 に答える