如何在ember中更新记录(PUT)

时间:2015-01-16 06:21:51

标签: ruby-on-rails ember.js ember-cli grape-api

我已尽力让我的ember应用程序更新我的rails 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);
     }
   }
});

edit.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()方法,但这似乎不起作用。任何帮助将非常感激。如果您需要查看任何其他代码,请告诉我们。

3 个答案:

答案 0 :(得分:0)

在手柄中,尝试将对model的引用直接更改为例如

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

告诉我们是否有效:)

答案 1 :(得分:0)

您尚未发布模型的代码,但我怀疑您没有在其上定义相关属性。 Ember Data仅序列化已声明的模型属性;您可以在模型上设置任意属性,但不会将其保存到服务器。你的模型应该是这样的:

import DS from 'ember-data';

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

答案 2 :(得分:0)

您的后端错误地解析参数以更新模型。在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不必要地冗长。