我正在尝试首次将角度应用与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>)`