2013-08-14 5 views
2

Я новичок в AngularJS, и я столкнулся с проблемой, когда пытаюсь сделать запрос POST с помощью AngularJS, и у него нет параметров с ним. Я использую Sinatra как интерфейс RESTful.AngularJS POSTs пустые запросы?

Вот как мой Синатра бэкенд выглядит:

post '/layer/:layer_id' do 
    @layer = PageLayer.where(id: params[:layer_id]).first 
    @layer.content = params[:content] 
    @layer.save 
end 

Если попытаться 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? Угловая возвращает пустой контент, поэтому 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 

Как я могу войти, что именно угловые сообщения?

+0

Вы можете попробовать '$ save' без параметров. Поскольку у вас уже есть объект. – Chandermani

+0

пробовал. Он отправляет запрос в/layer/вместо/layer /: layerId, поэтому Sinatra дает нам ошибку. Но я попытался слегка изменить контроллер, чтобы он размещался с пустыми save() и на правый адрес. Но он все еще POSTs пустой запрос ... Как я могу регистрировать, какие именно угловые POST? –

+0

Посмотрите объект '$ scope.layer' и посмотрите, есть ли у него свойство' layer_id', и он установлен для исправления значения внутри отладчика. А также проверьте наличие других свойств на уровне и попробуйте метод $ save без параметров. – Chandermani

ответ

1

Хорошо, я решил проблему. Каким-то образом Синатра не получала POST от Angular и не вводила их автоматически в параметры. Итак, если мы разобраем запрос вручную - он работает. Например:

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 
4

Эй, это точная проблема, с которой я столкнулся, и теперь ответ кажется таким очевидным. Я знал, что Угловая посылает json, но независимо от того, что я пробовал, он не работал. Это привело меня в правильном направлении, но для разбора JSON я должен был написать

ng_params = JSON.parse(request.body.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, чтобы иметь контроль над тем, что JSON данные Синатра отправляет обратно (не электронные письма или пароли, пожалуйста)

Мой Угловая код только это (пока еще не реализовали put, patch или delete или автоматическое обновление данных. Вам все равно придется обновлять страницу, чтобы увидеть новую запись.) И чтобы быть ясным, у меня есть таблица с именем foos, где модель ActiveRecord это «Foo», и один столбец с именем «ничего» (кроме отметки времени и идентификатора, который я уверен, всегда там).

// 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); 
    }); 
    }; 
}); 

Тогда в моей разметке форма выглядит следующим образом, где важным является призыв к «создать» с «ничего» в качестве аргумента в "нг подать. Если в вашей таблице имеется более одного столбца, вы вызываете «create» с более чем одним аргументом ex. 'create (anything, bar)'.

<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> 
+0

Да, я также использую body.read во всех новых запросах. Также есть хороший способ update_attributes, если вы символизируете ключи. Например: '@received_app = JSON.parse (request.body.read) .symbolize_keys; @ App.update_attributes! @ received_app.permit (@allowed_attrs) ' –

+0

круто, спасибо. Я новичок в угловой и всей этой отправке json туда и обратно, так что это помогает. – user462238

2

Это link решить эту проблему. Просто добавьте

камня 'стойка парсер'

к вашему Gemfile и добавьте этот код в config.ru. Будет работать как шарм.

require 'rack/parser' 
use Rack::Parser, content_types: { 
    'application/json' => Proc.new {|body| JSON.parse body } 
} 
+0

приятно и просто, спасибо! –

Смежные вопросы