0

Angular のリソース サービスを使用して Rails API に POST リクエストを送信しようとしています。angularクライアントとAPIの両方が同じサーバーにありません(したがって、クロスドメインがあります)。

リクエストを送信できません。おそらく複数の問題があると思います(角度コントローラーまたはサービスが間違っていると思います)。おそらくCSRF(クロスドメイン)に問題があります。

私はたくさんの投稿を読み、いくつかの提案を追加しました。

CSRFの目的

  1. 私が追加したレールに:

    • アプリケーション コントローラ:

      class ApplicationController < ActionController::Base        
      
       protect_from_forgery
      
      after_filter  :set_csrf_cookie_for_ng
      
       def set_csrf_cookie_for_ng
        cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
       end
      
       protected
      
       def verified_request?
         super || form_authenticity_token == request.headers['X_XSRF_TOKEN']
       end  
      end
      
  2. 角度で:

    • app.js:

      angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives', 'myApp.controllers', 'myApp.i18n']). config(['$routeProvider', '$httpProvider', function($routeProvider, $httpProvider) {
      $routeProvider.when('/boat-booking', {templateUrl: 'partials/boat-booking.html', controller: 'BoatBookingCtrl'}); $routeProvider.otherwise({redirectTo: '/home'}); delete $httpProvider.defaults.headers.common["X-Requested-With"];
      $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content'); }]);

POST リクエストの目的を送信する場合:

送信したい変数を持つコントローラーがあります:

.controller('BusinessCtrl', function ($scope, $location, Business) {

        $scope.createBusiness = function() {
            //var business = {name: "business1"};
            alert ("business:" + $scope.business);  
            alert ("businessName:" + $scope.business.name);  // This is showing the business name, so the value is in scope.
            $scope.business = Business.save($scope.business);                       
        };
    });

サービス:

  .factory('Business', 

      function($resource){          
        var businesses =
         $resource('http://127.0.0.1\\:3000/:business', {}, {       
            query: {method:'GET', params:{business:'businesses'}, isArray: true},
            save: {method:'POST', params:{business:'businesses'}, isArray: false}
         });        
         return businesses;           
      }
  );

これを実行すると、次のようになります。

Started OPTIONS "/businesses" for 127.0.0.1 at 2013-11-04 10:41:20 +0100

ActionController::RoutingError (No route matches [OPTIONS] "/businesses"):

レールログで。さまざまなエラー メッセージで他の組み合わせを試しましたが、どれも機能しませんでした。

ありがとう、ロバー。

アップデート

次のように、コントローラーのAngularサービス呼び出しからパラメーターを削除すると:

$scope.business = Business.save();  

次に、Rails のログが変更されます。ここで、OPTIONS の代わりに POST リクエストを送信します。しかし、私は他のいくつかのエラーがあります...

Started POST "/businesses" for 127.0.0.1 at 2013-11-04 11:00:31 +0100
Processing by BusinessesController#create as HTML
Can't verify CSRF token authenticity
Businesses_controller.create!!!!!
Completed 400 Bad Request in 1ms
4

1 に答える 1

1

この投稿でどのように解決したかをご覧ください。

Rails API にパラメーターを指定して Angular の投稿リクエストを送信する

よろしく、ロベルト。

于 2013-11-10T18:55:31.140 に答える