Rails + JS前端 - 问题

时间:2015-09-22 09:40:48

标签: ruby-on-rails json angularjs api devise

我正在尝试首次将角度应用与rails后端相关联。 我没有使用rails-api,因为我正在尝试建立一个“混合”网站,使用Devise进行用户身份验证,我的应用程序的其余部分是有角度的。

我的目标是保护应用程序,让我的所有路由都需要“current_user”从设计到显示任何内容。因此,如果您没有登录,您仍然可以访问角度应用程序,但它是空的,不会响应请求。

我知道这可能不是最佳做法,我应该使用rails-api,但我的目标是学习角度,因为我已经使用过rails我不想花太多时间用auth实现API(好吧,特别是我从未做过的auth部分)所以我决定这样做。

我遇到问题尝试实现最基本的连接:

    class TestController < ApplicationController
     skip_before_filter :verify_authenticity_token
      respond_to :json
      def index
        z = Test.all
        render :json => z
      end

      def create
        test = params[:data].permit!
         @x = Test.new(test)

        if @x.save
          render json: @x
        else
          render json: @x.errors
        end
      end

这是我的角度(显然它包含在功能中,但它更像是一个铁轨问题)

    $scope.list = $http.get('/tests.json').
    http.post('/tests.json', { data:this.form })

当我导航到localhost / mysite / tests.json时,我能够在浏览器中看到json数据,所以这似乎有效。

但是帖子请求完全失败了:

首先我得到了这个错误:

Can't verify CSRF token authenticity

我用它固定:

skip_before_filter :verify_authenticity_token

然后

没有这一行test = params[:data].permit! 我得到了ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):,虽然我真的不明白为什么我用一些研究使用.permit修复它!

正在出现的下一期

NoMethodError (undefined method test_detail_url'代表#)`

我的数据正在击中我的控制器,但由于该错误(我认为)不会保存在数据库中。

    Started POST "/tests.json" for ::1 at 2015-09-22 11:30:04 +0200
    Processing by TestsController#create as JSON
      Parameters: {"data"=>{"motivated"=>"Never", "best"=>"Never"}}
       (0.1ms)  begin transaction
      SQL (0.8ms)  INSERT INTO "test_details" ("motivated", "best") VALUES (?, ?)  [["motivated", "Never"], ["best", "Never"]]
       (1.8ms)  commit transaction
    Completed 500 Internal Server Error in 21ms

    NoMethodError (undefined method `test_detail_url' for #<TestsController:0x007f965b77cee8>):
      app/controllers/tests_controller.rb:17:in `create'

这似乎意味着rails在成功发布请求后试图重定向我,但我似乎无法找到一种方法来禁用该默认行为,因为我正在使用json和一个前端应用程序我总是在我的Angular应用程序所在的默认视图,我不需要重定向。

我不知道如何以及为什么它的行为如此诚实。我之前已经实现了ajax post请求,但从未遇到过这样的问题。我将禁用表单的默认行为将我的数据发送为json,它将完美地工作而无需重新加载页面/重定向/等。

感谢您的帮助

更新:我刚看到使用skip_before_filter :verify_authenticity_token这很糟糕。所以我这样做了 https://medium.com/@tomchentw/csrf-protection-in-angularjs-with-rails-backend-9280537fcf6b 它解决了这个问题,但现在又回到了

`NoMethodError (undefined method `test_detail_url' for #<testsController:0x007f965b77cee8>)`

0 个答案:

没有答案