2016-06-23 62 views
0

私のRailsアプリケーションでは、AJAX経由でコントローラにJSONを渡そうとしていますが、私は401 (unauthorized)エラーに遭遇しています。私はこれを研究し、私が間違っていたことを理解しようとしていますが、私はそれほど話せません。Rails - 401(unauthorized)error - JSONとAJAXのコントローラ

まずオフ、AJAX自体 -

$.ajax({ 
    url: "report/submission", 
    type: "POST", 
    beforeSend: function(xhr) {xhr.setRequestHeader("X-CSRF-Token", $("meta[name='csrf-token']").attr("content"))}, 
    data: {"report" : reportParameter} 
}); 

これはReportコントローラでsubmissionアクションにデータを渡す -

class ReportController < ApplicationController 

    before_action :authenticate_user!, :only => [:submission] 

    def submission 
     INSERT ENTRIES TO DB, ETC 
    end 

end 

ので、おそらく1つの複雑な要因は、私はbefore_actionを必要だということですログインしてください。

基本的なプロセスは、ユーザーがフォームを完了し、あるので、エントリはJSONに組み立てられる(reportParameter)、その後、完了するのに成功したログインが必要ですsubmissionアクションに渡された(私は後方に見えるかもしれませんが知っているが、それこの特定のアプリに必要です)。

私のレイアウトには<%= csrf_meta_tags %>が含まれており、applicationコントローラにはprotect_from_forgery with: :null_sessionが設定されています。

私はこれ以上の洞察を深めるには十分理解できないことを認めなければなりません - これはCSRFトークンに関する認可問題ですが、私はAJAXのbeforeSendを設定するとそれに対処すると考えました。

ご指摘いただければ幸いです。

+0

したがって、ユーザーがajaxコールを発信すると、ログインしていませんか? – Uzbekjon

+0

はい、正しいです。呼び出しがログインする前に行われ、正常にログインすると、JSONの内容が解析されてDBに記録されます。 – skwidbreth

答えて

0

標準レールフォーム(form_tagまたはform_for)を使用している場合、簡単な方法はjquery-ujsです。これは、デフォルトではapplication.jsに通常ある:

# application.js 
//= require jquery_ujs 

それは自動的にCSRFトークンを処理し、jQueryのajax方法(手動でやっているもの)に追加されます。

application.jsファイルをページに追加したくない場合は、単にjquery-ujs.jsファイルを含めることができます。

これもやりたくないのであれば、あなたのフォームでは「古い」または「最新ではない」csrfトークンを使用していることが考えられます。 。次に、隠しフォームのcsrfトークンが送信されていないか、リクエストヘッダーで送信しているcsrfトークンと一致していることを確認します。 Hereはあなたに私が何を意味するのかを伝えることです。

+0

ええ、それは事です。私は、標準の 'form_tag'と' form_for'を避けようとしています。私は理由はありますが、私はこの全部の仕組みを再考する必要があるかもしれないと思っています... – skwidbreth

+0

その場合、単純にあなたのページに 'jquery-ujs.js'を追加することができます。 。 – Uzbekjon

+0

私はそれを試してみましょう - それが動作するかどうかをお知らせします。あなたの時間と専門知識をありがとう。 – skwidbreth

関連する問題