Ruby On Rails应用程序与angularJS关于AJAX

Ruby On Rails Application with angularJS about AJAX

本文关键字:angularJS 关于 AJAX 应用程序 On Rails Ruby      更新时间:2023-09-26

我是angularJS和Rails的新手,我尝试用angularJS 构建Rails应用程序

现在,我想做一个POST请求,发送数据插入数据库

活动控制器

def create
        @activity = Activity.new(params[:activity])
        respond_to do |format|
            if @activity.save
                format.html {redirect_to activities_url}
                format.json { render activities_url, status: :created, location: @activity}
            end
        end
end

活动咖啡JS

app = module('activity', ['ngAnimate'])
app.controller 'FormCtrl', ($scope, $http) ->
    config = {
        header: {
            'Content-Type': 'application/json'
        }
    }
    @test = ->
        $http.post('/activities.json', {title: 'test1'}, config).success (data, status) ->
            console.log(data)
            console.log(status)
return

控制台日志

Started POST "/activities.json" for ::1 at 2016-05-04 21:06:10 +0800
Processing by ActivitiesController#create as JSON
  Parameters: {"title"=>"test1", "activity"=>{"title"=>"test1"}}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 2ms (ActiveRecord: 0.0ms)

我创建了一个ng-click按钮来触发测试功能,但我得到了控制台日志等信息,我该如何修复它?

这里有一个很好的答案:在不禁用CSRF保护的情况下设计Rails API

其要点是,您可以将CSRF令牌放入一个名为XSRF-TOKEN的cookie中,如下所示:

# In my ApplicationController
after_filter :set_csrf_cookie
def set_csrf_cookie
  if protect_against_forgery?
    cookies['XSRF-TOKEN'] = form_authenticity_token
  end
end

然后,您必须在ApplicationController中重载verified_request?方法来加载Angular将返回的令牌:

protected
def verified_request?
  super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN'])
end

(不过,请阅读我包含的链接……有一些注意事项,但我认为你无论如何都想要这样的东西……基本上,你的登录操作不应该受到csrf的保护,但其他潜在的破坏性操作应该受到保护。你可以用skip_before_filter实现这一点。)

我希望这能有所帮助!

我相信实现这一点的最快方法是使用helper方法form_authenticity_token

$http({
  method: 'POST',
  url: '<%= some_path %>',
  params: { 
    authenticity_token: '<%= form_authenticity_token %>',
    ... // Other params
  }
})

没有必要取消CSRF,我根本不建议取消。

您的问题是rails的一个功能,旨在击败所谓的"跨站点请求伪造"。Rails团队已经在他们的网站上详细描述了这一点,但基本上这是一个生成的令牌,旨在确保生成对web api的请求的表单是您提供的表单。这通常会给单页AJAX应用程序带来麻烦。

"快速解决方案"是通过在控制器中添加类似内容来禁用CSRF。

protect_from_forgery :except => :create

希望这能有所帮助!