Как обновить записи (PUT) в ember

Я пробовал все, что мог, чтобы приложение ember обновляло API рельсов без успеха. Мой текущий код выглядит так: редактировать маршрут

import Ember from 'ember';

export default Ember.Route.extend({ 

  actions: {
        submit: function(){
          var model = this.controller.get('model');
          model.save();
          this.transitionTo('movies.show', model);
     }
   }
});

редактировать.hbs

<form>
  <div class="form-group col-sm-4">
    <label for="title" class="col-sm-2 control-label">Title</label>
    <div class="col-sm-10">
        {{input value=title id=title class="movie-title"}}
    </div>
  </div>

  <div class="form-group col-sm-4">
    <label class="col-sm-2 control-label" for="director">Director</label>
    <div class="col-sm-10">
        {{input value=director id="director" class="movie-director"}}
    </div>
  </div>

  <div class="form-group col-sm-4">
    <label class="col-sm-2" for="rating">Rating</label>
    <div class="col-sm-10">
        {{input value=rating id="rating" class="movie-rating"}}
    </div>
  </div>
  <button type="submit" class="btn btn-primary btn-block commit-movie-change" {{action 'submit'}}>Add</button>
</form>

router.js

import Ember from 'ember';
import config from './config/environment';

var Router = Ember.Router.extend({
  location: config.locationType
});

Router.map(function() {
  this.resource('movies', function(){
    this.route('show', {path: ':movie_id'});
    this.route('edit', {path: ':movie_id/edit'});
    this.route('create', {path: 'create'});
  });
});

export default Router;

моя модель выглядит

import DS from 'ember-data';

export default DS.Model.extend({
  title: DS.attr('string'),
  director: DS.attr('string'),
  rating: DS.attr('string')
});

На самом деле это работает для локального обновления и запуска PUT на сервер, но не отправляет какие-либо свойства/параметры в API. и когда я смотрю журнал сервера, он показывает

Started PUT "/api/v1/movies/10" for 127.0.0.1 at 2015-01-16 01:00:50 -0500
Movie Load (0.7ms)  SELECT  "movies".* FROM "movies"  WHERE "movies"."id" = 10 LIMIT 1
 (0.4ms)  BEGIN
 (0.6ms)  COMMIT

Я в недоумении от этого. Я пытался написать метод updateRecord() в маршруте, но это не работает. Любая помощь будет очень признательна. Если вам нужно увидеть какой-либо другой код, дайте мне знать.


person MiCo    schedule 16.01.2015    source источник
comment
У вас установлен Ember Inspector? Когда вы вводите значения в поля, получает ли их модель? Если вы обращаетесь к модели в консоли, меняете некоторые значения и сохраняете ее, отправляются ли значения на сервер?   -  person Buck Doyle    schedule 16.01.2015
comment
@BuckDoyle Я все еще считаю себя нубом, поэтому, пожалуйста, наберитесь терпения. Когда я смотрю на Ember Inspect и нажимаю на модель, она показывает значения атрибутов. Что касается ввода данных в консоль, я не уверен, как манипулировать данными перед отправкой.   -  person MiCo    schedule 16.01.2015
comment
@BuckDoyle в консоли говорит, что мои атрибуты не определены. Означает ли это, что моя функция отправки в моем маршруте редактирования не определена должным образом?   -  person MiCo    schedule 16.01.2015
comment
Нет проблем с новичком. Я не эксперт. Если вы нажмете $E для модели, инспектор установит переменную $E в консоли в модель. Затем вы можете использовать $E.set('title', 'a title'); для установки заголовка и $E.save() для сохранения модели. Содержит ли HTTP-запрос атрибут?   -  person Buck Doyle    schedule 16.01.2015
comment
Можете ли вы обновить свой вопрос с кодом для вашей модели?   -  person Buck Doyle    schedule 16.01.2015


Ответы (3)


Ваш сервер неправильно анализирует параметры для обновления модели. В rails/app/controllers/api/v1/movies.rb у вас есть это для PUT:

Movie.find_by_id(params[:id]).update_attributes(declared(params[:movie], {include_missing: false}))

Когда я запустил ваши приложения Ember и Rails, я увидел, что Ember правильно отправляет атрибуты в API, поэтому я добавил binding.pry в код put, чтобы посмотреть поближе. Там я обнаружил, что вызов declared отфильтровывал все атрибуты. Если вместо этого вы измените его на это, он будет работать:

Movie.find_by_id(params[:id]).update_attributes(declared(params, {include_missing: false})[:movie])

Я никогда не использовал Grape, поэтому не знаю, идиоматично ли это, но это работает.

Кстати, вы можете просто использовать Movie.find(params[:id]); find_by_id излишне многословен.

person Buck Doyle    schedule 16.01.2015
comment
Спасибо, что изучили это. В данный момент я нахожусь вдали от своего компьютера, но обновлю свой метод выхода, как только смогу, и обновлю ответ после подтверждения. Кстати, я начал подозревать, что проблема в моем API. - person MiCo; 17.01.2015

В руле попробуйте изменить прямые ссылки на ваш model, например, на

{{input value=title id=model.title class="movie-title"}}

и дайте нам знать, если это сработало :)

person andrusieczko    schedule 16.01.2015
comment
к сожалению, это не сработало. Я также пробовал model.title в поле значения, но безуспешно. Должен быть способ, и это безумие, что я не могу найти решение проще. - person MiCo; 16.01.2015
comment
после этой строки: var model = this.controller.get('model');, каков результат this.controller.get('model.title')? `this.controller.get('model')._data пуст? - person andrusieczko; 16.01.2015
comment
существует ли ваша модель в контроллере? у вас это где-то определено? - person andrusieczko; 16.01.2015
comment
применение this.controller.get('model.title') нарушает код. И я полагаю, что вы вызываете this.controller.get('model'), потому что шаблоны должны явно проходить через контроллер, чтобы добраться до модели. Моя модель определена в подпапке моих моделей. имейте в виду, что я использую ember-cli. - person MiCo; 16.01.2015
comment
извините за вопрос, но вы уверены, что это не отправлено на сервер? Вы проверили http-запрос? например в хроме в разделе «Сеть» на вкладке «Заголовки»? Полезная нагрузка запроса — это то, что вы хотите проверить. - person andrusieczko; 16.01.2015
comment
я уверен, что каждый раз, когда я отправляю запрос, я смотрю на свой API, чтобы увидеть, была ли обновлена ​​​​база данных, и это не так. Что ж, позвольте мне перефразировать, прежде чем я настрою свой API так, чтобы он не включал недостающие параметры, это отправит пустую полезную нагрузку, и вся моя запись будет обновлена ​​​​до нулевых значений. - person MiCo; 16.01.2015

Вы не опубликовали код своей модели, но я подозреваю, что вы не определили для нее соответствующие атрибуты. Ember Data сериализует только объявленные атрибуты модели; вы можете установить любое произвольное свойство модели, но оно не будет сохранено на сервере. Ваша модель должна выглядеть примерно так:

import DS from 'ember-data';

export default DS.Model.extend({
  title: DS.attr('string'),
  director: DS.attr('string'),
  rating: DS.attr('string')
});
person Buck Doyle    schedule 16.01.2015
comment
действительно, моя модель определена так, как вы опубликовали. Я могу создавать новые записи в течение всего дня, я просто не могу их обновлять. вот что так разочаровывает в этом разделе кода, потому что там действительно нет прямых примеров, и я, по-видимому, единственный, кто этого не понимает. такова жизнь - person MiCo; 16.01.2015
comment
только что попытался установить заголовок, и запрос был отправлен, но атрибуты все еще не определены. - person MiCo; 16.01.2015
comment
Ах, это было просто предположение, основанное на том, что случилось со мной в прошлом. Что ж, у меня скоро интервью, так что я не могу думать об этом какое-то время, но я думаю, что в конце концов мы во всем разберемся. - person Buck Doyle; 16.01.2015
comment
Одна мысль: что вы видите, когда через инспектор отправляете модель в консоль и набираете $E.constructor? - person Buck Doyle; 16.01.2015
comment
Он возвращает my-flicks@model:movie - person MiCo; 16.01.2015
comment
хм, есть еще одна теория. У вас есть что-нибудь в app/adapters, app/serializers или app/transforms? - person Buck Doyle; 16.01.2015
comment
У меня есть activeModelAdapter с пространством имен и набором хостов. Ничего в сериализаторах или преобразованиях - person MiCo; 16.01.2015
comment
вы можете проверить код в его текущем виде github.com/micoch/myFlicks.git - person MiCo; 17.01.2015