2013-09-05 3 views
13
1.0.0

Je ne peux pas sembler traquer la source de cette erreur:Ember échec RESTAdapter

Assertion failed: No model was found for '0'

Le JSON est d'obtenir récupéré par le serveur, mais l'application est la moindre erreur avant qu'il ne soit envoyé à le gabarit. Le problème semble se produire entre l'adaptateur REST et le routeur. Le modèle rend sans erreur lorsque j'utilise l'adaptateur de luminaire. J'utilise les versions Ember et Handlebars 1.0.0.

Voici mon code App:

window.App = Ember.Application.create(); 

App.ApplicationAdapter = DS.RESTAdapter.extend({ 
    host: 'http://localhost:3000' 
}); 

App.Router.map(function() { 
    this.resource("stories", { path: "/" }, function() { 
     this.resource("boards", { path: "/boards"}) 
    }); 
}); 

App.StoriesRoute = Ember.Route.extend({ 
    model: function() { 
     return this.store.findAll('story'); 
    } 
}); 

attr = DS.attr; 

App.Story = DS.Model.extend({ 
    color: attr() 
}); 

Guidons modèles

<script type="text/x-handlebars"> 
    {{ outlet }} 

    </script> 

    <script type="text/x-handlebars" data-template-name="stories"> 
    <ul> 
     <li class="storyLine"> 
      <ul> 
       <li id="colorSwatch"></li> 
       <li class="board">+</li> 
      </ul> 
     </li> 
    </ul> 
    <ul> 
    {{#each model}} 
     <li class="storyLine"> 
      <ul> 
       <li id="colorSwatch" {{bindAttr class=story.color}}></li> 
       <li class="board">dddd</li> 
      </ul> 
     </li> 
    {{/each}} 
    </ul> 
    </script> 

Merci pour votre aide!

Répondre

25

La réponse du serveur n'est probablement pas formatée correctement. Le JSON doit avoir une racine portant le même nom que votre modèle. Voir: Votre réponse http://emberjs.com/guides/models/the-rest-adapter/#toc_json-root doit ressembler à ceci:

{ 
    "story": [ 
    { 
     "id": 0, 
     "title": "foo" 
    }, 
    { 
     "id": 1, 
     "title": "bar" 
    } 
    ] 
} 
+1

Le formatage de JSON n'est pas le problème. Lorsque je colle la réponse dans une variable et l'utilise plutôt que de l'obtenir du serveur, tout va bien. –

+0

Intéressant. Je recevais la même erreur, et l'ajout d'une racine à la réponse json l'a corrigé pour moi. Je ne suis pas sûr de quoi d'autre provoque cette erreur. –

+2

Aha - J'avais tort, le JSON était le problème, comme vous l'avez suggéré. J'avais besoin d'utiliser Active Model Serializer dans Rails pour satisfaire le Picker Ember RESTAdapter. Être averti! –

0

Dans votre bindAttr vous utilisez l'objet story donc vous devriez changer votre {{#each}} aide pour faire référence à cet objet:

... 
{{#each story in model}} 
    <li class="storyLine"> 
    <ul> 
     <li id="colorSwatch" {{bindAttr class=story.color}}></li> 
     <li class="board">dddd</li> 
    </ul> 
    </li> 
{{/each}} 
... 

Hope it helps.

+0

la pensée de Nice mais le problème semble être avec l'adaptateur ou routeur, pas le modèle. –

0

j'ai eu une erreur similaire lors du passage d'un FixtureAdapter étendu à une RESTAdapter prolongée. J'étais en train d'écraser une des méthodes finder.

Bien qu'il y ait le FixtureAdapter était tout à fait heureux avec un tableau d'objets

findQuery: function(store, type, query, array) { 
    return DS.PromiseArray.create({ 
     promise: new Promise(function(resolve, reject){ 
      var results = []; 
      store.findAll('source').then(function(sources) { 
       sources.forEach(
        function (rootSource) { 
         results.push(store.createRecord(...)); 
        } 
       ); 
       resolve(results); 
      },reject); 
     }) 
    }); 
} 

pour la même méthode, le RESTAdapter prévu un objet clé et tableau en tant que valeur

findQuery: function(store, type, query, array) { 
    return new Ember.RSVP.Promise(function(resolve, reject){ 
     var results = []; 
     store.find('source').then(function(sources) { 
      sources.forEach(
       function (rootSource) { 
        results.push({ ... }); 
       } 
      ); 
      resolve({"connections":results}); 
     },reject); 
    }); 
}, 

Voyez la différence dans le appel du resolve.

Même il travaille à mettre un objet dans le tableau comme dans le FixtureAdapter, cela se traduira par l'erreur Assertion failed: You must use Ember.set() to access this property plus tard lorsque vous essayez de modifier les propriétés des objets. Pour ce faire, j'utilise Ember 1.2.0, Ember Data: 1.0.0-beta.7 + canary.b45e23ba.

Hope this helps ...

Questions connexes