我是AngularJS的新手,当我尝试使用AngularJS发出POST请求时,我遇到了一个问题,并且它没有使用POST发送任何参数。我使用Sinatra作为RESTful接口。
这就是我的Sinatra后端的样子:
post '/layer/:layer_id' do
@layer = PageLayer.where(id: params[:layer_id]).first
@layer.content = params[:content]
@layer.save
end
如果尝试使用Postman chrome扩展程序POST - 它可以正常工作! Sinatra正确保存内容。所以我确信后端可以正常工作。
这就是我的角度测试代码的样子:
TestCtrl = ($scope, $routeParams, $http, $resource) ->
$scope.layer = []
Layer = $resource('/layer/:id', {id:'@id'})
$scope.layer = Layer.get {id: $routeParams.layerId}, ->
console.log "Got you!"
$scope.saveContent = ->
$scope.layer.$save()
console.log "Saved!"
angular.module('appDirectives', []).directive "test", ->
return (scope, element, attrs) ->
element.bind "blur", ->
console.log("blur!")
scope.saveContent()
和HTML代码:
<div>Content: {{layer.content}}</div>
<div>
<form>
<input type="text" test ng-model="layer.content">
</form>
</div>
所以,唯一的问题是:出了什么问题?为什么我可以向Postman提出正确的请求而不是使用angularJS? Angular返回空的“内容”,因此Sinatra每次都将其保存为“”。
我还附加了一个图层的结构:
g {id: 27245, page_id: 2302, external_id: 26518, original_upload: null…}
content: "dfgdfg"
external_id: 26518
id: 27245
layerNumber: 8
page_id: 2302
如何记录究竟有角度的POST?
答案 0 :(得分:4)
嘿,这是我遇到的确切问题,现在答案显而易见。我知道Angular正在发送json,但不管我做了什么都没有用。这导致我朝着正确的方向发展,但至于解析json我必须写
ng_params = JSON.parse(request.body.read)
我不得不将'string'更改为'read'。也许我有一个更新版本的json gem或其他东西。我的完整保存过程是这样的:
post '/api/v1/test' do
ng_params = JSON.parse(request.body.read)
@foo = Foo.new(ng_params)
if @foo.save
puts "Page Saved"
content_type :json
rabl :foos, format: "json"
end
end
我使用rabl格式化json以控制Sinatra发回的json数据(请不要发送电子邮件或密码)
My Angular代码就是这样(尚未实现put,patch或delete,还没有自动更新数据。你仍然需要刷新页面才能看到新帖子。)要清楚,我有一个名为'foos'的表,其中ActiveRecord模型为'Foo',一列名为'anything'(除了timestamps和id,我确定它总是在那里)。
// app declaration
var app = angular.module("App", ['ngResource']);
// data service
app.factory('Foo', ['$resource', function($resource) {
return $resource('/api/v1/test/:id', {id: '@id'});
}]);
// the controller
app.controller('Controller', function($scope, Foo) {
$scope.foos = Foo.query();
$scope.create = function(anything) {
Foo.save({anything: anything}, function(foo){
$scope.foos.push(foo);
});
};
});
然后在我的标记中,表单看起来像这样,重要的是在'ng-submit'中使用'anything'作为参数调用'create'。如果表中有多个列,则使用多个参数ex调用“create”。 '创造(任何事物,酒吧)'。
<h3>Add something new</h3>
<form ng-submit="create(anything)">
<input ng-model="anything" type="text">
<button type="submit">Do it</button>
</form>
显示数据时
<li ng-repeat="foo in foos">
<p>{{foo.anything}}</p>
</li>
答案 1 :(得分:2)
这link解决了这个问题。只需添加
gem'port-parser'
到你的 Gemfile 并将此代码添加到 config.ru。将像魅力一样工作。
require 'rack/parser'
use Rack::Parser, content_types: {
'application/json' => Proc.new {|body| JSON.parse body }
}
答案 2 :(得分:1)
好的,我已经解决了这个问题。不知怎的,Sinatra没有正确地从Angular获得POST,并没有自动将它们放入params。 因此,如果我们手动解析请求 - 它可以工作。像那样:
post '/layer/:layer_id' do
@updated_layer = JSON.parse(request.body.string)
@layer = PageLayer.where(id: params[:layer_id]).first
@layer.content = @updated_layer['content']
@layer.save
end