2013-03-08 23 views
8

Tôi đang sử dụng Devise để xác thực người dùng trong ứng dụng Rails. Tôi đã cố gắng sử dụng AngularJS thay vì giàn giáo đường ray mặc định trong một ứng dụng. Vấn đề là khi tôi thêm before_filter: authenticate_user! trong bộ điều khiển thì AngularJS gọi để cập nhật/lưu và xóa một tài nguyên không hoạt động nói truy cập trái phép (401). Dưới đây là một số mã:Lỗi xác thực khi sử dụng Rails - Devise và AngularJS

Nguồn:

@app.factory "employeesDB", ($resource) -> 
    $resource("/employees/:id", {id: "@id"}, {update: {method: "PUT"}}, 
    {destroy: {method: "DELETE"}} 
) 

Các lưu hành động:

$scope.saveEmpl = -> 
    $scope.em = new Object if !$scope.em 
    employeesDB.save({}, $scope.em, (resource) -> 
     $scope.employees.push(resource) 
    , (response) -> 
     console.log("Failed") 
    ) 

$ scope.em là đối tượng chứa dữ liệu cho các hồ sơ và nó là ràng buộc để góc sử dụng ng-model.

Mọi thứ hoạt động hoàn hảo nếu tôi xóa before_filter: authenticate_user! từ bộ điều khiển

class EmployeesController < ApplicationController 
    #before_filter :authenticate_user! 

Sự cố chỉ xảy ra khi tôi cố gắng lưu/cập nhật/xóa bản ghi, chỉ đọc nó hoạt động OK.

Bất kỳ ý tưởng nào ?? Có hướng dẫn cụ thể nào tôi nên tuân thủ khi sử dụng Angular and Devise không? Tôi là người mới đến đường ray và angularJS nên một lời giải thích chi tiết sẽ được đánh giá cao! Cảm ơn

+0

Bạn đã thử chuyển tham số 'withCredentials' tới các giá trị mặc định $ httpProvider của mình chưa? 'app.config (['$ httpProvider', hàm ($ httpProvider) {$ httpProvider.defaults.withCredentials = true;}]);'? – Stewie

+0

Đã thêm thông tin sau nhưng tiếc là nó không hoạt động. Tôi nhận được cùng một vấn đề. @ App = angular.module ("Mathra", ["ngResource"]). Config (['$ httpProvider', ($ httpProvider) -> $ httpProvider.defaults.withCredentials = true ]) – jkotzi

Trả lời

10

Bạn có thể thêm video này vào app.js của bạn:

myApp.config([ 
    "$httpProvider", function($httpProvider) { 
    $httpProvider.defaults.headers.common['X-CSRF-Token'] = angular.element('meta[name=csrf-token]').attr('content'); 
    } 
]); 

nào thêm CSRF dấu hiệu cho tất cả các yêu cầu kiễu góc.

EDIT: Bây giờ jQuery độc lập (sử dụng jqLite).