如何在 ember 中更新记录 (PUT)
How to update records (PUT) in ember
我已尽我所能让我的 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()
方法,但这似乎不起作用。任何帮助将不胜感激。如果您需要查看任何其他代码,请告诉我。
在车把中,尝试将对 model
的直接引用更改为例如
{{input value=title id=model.title class="movie-title"}}
让我们知道它是否有效:)
你没有贴出你模型的代码,但我怀疑你没有在上面定义相关的属性。 Ember Data 仅序列化已声明的模型属性;您可以在模型上任意设置 属性,但不会保存到服务器。您的模型应如下所示:
import DS from 'ember-data';
export default DS.Model.extend({
title: DS.attr('string'),
director: DS.attr('string'),
rating: DS.attr('string')
});
您的后端错误地解析参数以更新模型。在 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 正确发送属性,所以我添加了在您的 put
代码中添加 binding.pry
以便更仔细地查看。在那里我发现对 declared
的调用过滤掉了所有属性。如果改为这样,它会起作用:
Movie.find_by_id(params[:id]).update_attributes(declared(params, {include_missing: false})[:movie])
我从未使用过 Grape,所以我不知道这是否符合习惯,但它确实有效。
顺便说一句,你可以只使用Movie.find(params[:id])
; find_by_id
不必要地冗长。
我已尽我所能让我的 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()
方法,但这似乎不起作用。任何帮助将不胜感激。如果您需要查看任何其他代码,请告诉我。
在车把中,尝试将对 model
的直接引用更改为例如
{{input value=title id=model.title class="movie-title"}}
让我们知道它是否有效:)
你没有贴出你模型的代码,但我怀疑你没有在上面定义相关的属性。 Ember Data 仅序列化已声明的模型属性;您可以在模型上任意设置 属性,但不会保存到服务器。您的模型应如下所示:
import DS from 'ember-data';
export default DS.Model.extend({
title: DS.attr('string'),
director: DS.attr('string'),
rating: DS.attr('string')
});
您的后端错误地解析参数以更新模型。在 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 正确发送属性,所以我添加了在您的 put
代码中添加 binding.pry
以便更仔细地查看。在那里我发现对 declared
的调用过滤掉了所有属性。如果改为这样,它会起作用:
Movie.find_by_id(params[:id]).update_attributes(declared(params, {include_missing: false})[:movie])
我从未使用过 Grape,所以我不知道这是否符合习惯,但它确实有效。
顺便说一句,你可以只使用Movie.find(params[:id])
; find_by_id
不必要地冗长。