【问题标题】:Angular $resource query gets a 401 on PUT when no CSRF is defined and a 404 on GET when CSRF is defined :/当没有定义 CSRF 时,Angular $resource 查询在 PUT 上获得 401,在定义 CSRF 时在 GET 上获得 404:/
【发布时间】:2013-12-10 14:34:20
【问题描述】:

我目前遇到更新列表问题。 我使用 Rails 和 AngularJS。

在 JS 方面,我使用 Angular $resource 功能插入 jQueryUI 以实现可排序功能,以读取、更新(并在第二步中删除和创建)已排序的文本块。

例如。

  • “1 - lorem ipsum”

  • “2 - 第二位置 lorem ipsum”

  • “3 - 第三个位置”


在 AngularJS 控制器中我有这个:

 function DndCtrl($scope, $resource) {
   var Feed = $resource('/users/'+ userId +'/test/:id', {id: '@id'}, {'update': {method:"PUT", isArray:true}});

   $scope.tests = Feed.query(function() {
    $scope.updateSortable = {
    // jQueryUI methods
     update: function(e, ui) {
     // trigger after user ends dropping item
      for (var i=0; i<$scope.tests.length; i++) {
        var t = $scope.tests[i];
        t.position = i+1;
        t.$update();
      }
     },
     placeholder: "t-hightlight",
     axis: 'y'
    };
   });

 } // end DnD

排序后的输出:

  PUT http://demo.mytest.dev/users/1/test/1 401 (Unauthorized)

并在服务器日志中:

  warning can't verify csrf

于是我在这个话题上找到了:Rails CSRF Protection + Angular.js: protect_from_forgery makes me to log out on POST HuangYuHei 的答案并尝试了一下。

然后控制台输出:

  GET http://demo.mytest.dev/users/1/test 404 (Not Found) 

在服务器日志上:

  Test Load (1.9ms)  SELECT "tests".* FROM "tests" WHERE "tests"."id" = 2 LIMIT 1
  Unpermitted parameters: id

我直接在rails控制台中测试了请求,它很好地返回了条目。

我做错了什么?我错过了 Rails 配置部分的内容吗?还是在 Angular 部分?

【问题讨论】:

    标签: ruby-on-rails jquery-ui angularjs


    【解决方案1】:

    您在 Rails 控制器操作中遇到了strong_params 问题。

    strong_params 是 Rails 4 中的新功能,它取代了之前版本中的 attr_accessible 模型属性。您现在在控制器中指定允许在查询中使用来自 params 的哪些字段。

    它应该看起来像这样:

    respond_with Test.find(params.permit(:id))
    # or 
    render json: Test.find(params.permit(:id))
    

    【讨论】:

    • 哦,谢谢,我觉得我们已经接近解决方案了!!我尝试了您的两种解决方案+在模型中添加了 attr_accessible 。错误输出在 500 状态下发生变化,并带有“参数错误(未知:id)”关于我应该深入挖掘什么的任何想法?
    • 经过一些调查,我有这种行为:角度进行了 $update,Rails 很好地保存在数据库中。一切都很好但是,在前端,控制台返回错误 500。我怎样才能避免显示,因为更新运行良好?
    • 这是 rails 给出的响应,产生了这个错误。在 Rails 上,更新时,我们只需要执行 save() 并渲染页面。 :) 感谢您的指出
    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2018-02-07
    相关资源
    最近更新 更多