【问题标题】:Ruby On Rails Application with angularJS about AJAXRuby On Rails 应用程序与 angularJS 关于 AJAX
【发布时间】:2016-08-29 22:57:46
【问题描述】:

我是 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 按钮来触发测试功能,但我得到了控制台日志等信息,我该如何解决?

【问题讨论】:

标签: javascript ruby-on-rails angularjs ruby ajax


【解决方案1】:

这里有一个很好的答案:Rails API design without disabling CSRF protection

它的要点是您可以将 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。)

希望对你有帮助!

【讨论】:

  • 很好的答案,比我的好多了。
  • 谢谢!我对您的回答的评论无意冒犯,当我想到没有它的潜在问题时,我只是畏缩。
  • 感谢您的回答。现在,我有一个新问题,我成功将数据发送到数据库,但是为什么我不能看到数据更新,除非我自己刷新浏览器?
  • 那完全是另一回事。基本上,您最好构建一个 AngularJS 服务 (docs.angularjs.org/api/ng/service) 来包装您与正在构建的 Rails api 的交互。然后该服务将从 Rails 获取响应并更新您的 Angular 范围。
  • 您是否在控制台中看到data?您的页面必须有一些变量绑定,您将 data 放入其中。
【解决方案2】:

我相信最快的方法是使用辅助方法form_authenticity_token。

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

没有必要禁用我完全不推荐的 CSRF。

【讨论】:

    【解决方案3】:

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

    “快速修复”是通过向控制器添加类似的内容来禁用 CSRF。

    protect_from_forgery :except =&gt; :create

    希望这会有所帮助!

    【讨论】:

    • 虽然它是一个“快速修复”,因为它可以让事情发生并消除当前的障碍,但我认为 csrf 值得花几分钟的前期工作来避免您的网站出现任何麻烦/app 变得流行到足以成为目标。
    • 不要反对。 CSRF 值得为生产代码保留。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多