2016-06-21 8 views
0

So habe ich begonnen, diesen Fehler, nachdem ich versuchte, AJAX Kommentare in meiner Rails-Anwendung zu implementieren:Action :: InvalidAuthenticityToken Fehler in der Steuerung

ActionController::InvalidAuthenticityToken in CommentsController#create  

ActionController::InvalidAuthenticityToken 

    def handle_unverified_request 
     raise ActionController::InvalidAuthenticityToken 
    end 
    end 
end 

Hier sind alle Codes aus den relevanten Dateien:

comments_controller.rb

class CommentsController < ApplicationController 


    before_action :find_post 

    def create 
    @comment = @post.comments.build(comment_params) 
    @comment.user_id = current_user.id 

    if @comment.save 
     respond_to do |format| 
     format.html { redirect_to root_path } 
     format.js 
     end 
    else 
     flash[:alert] = "Check the comment form, something went horribly wrong." 
     render root_path 
    end 
    end 

Kommentare hinzufügen Form:

= form_for([post, post.comments.build], remote: true) do |f| 
    = f.text_field :content, placeholder: 'Add a comment...', class: "comment_content", id: "comment_content_#{post.id}" 

views/Kommentare/create.js.erb

$('#comments_<%= @post.id %>').append("<%=j render 'comments/comment', post: @post, comment: @comment %>"); 
$('#comment_content_<%= @post.id %>').val('') 

comment.rb

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :post 
end 

Ich habe keine Ahnung, was diesen Fehler verursacht, wie es vor der Einführung von AJAX fein gearbeitet. Ich habe Antworten auf ähnliche Probleme auf Stackoverflow nachgeschlagen und hinzugefügt protect_from_forgery an der Spitze comments_controller.rb vergebens. Ich habe nicht den InvalidAuthenticityToken Fehler in Ordnung, aber stattdessen gibt es mir einen anderen Fehler:

NoMethodError in CommentsController#create 

undefined method `id' for nil:NilClass 

def create 
    @comment = @post.comments.build(comment_params) 
    @comment.user_id = current_user.id #highlighted line 

    if @comment.save 
    respond_to do |format| 
+0

Haben Sie csrf_meta_tags in Ihrem Layout? –

+0

@FrederickCheung Ja, der Aufruf von 'csrf_meta_tags' ist dort in der Layout-Datei – Arif

Antwort

0

Sie haben ein Echtheits Token mit Ihren Formularen zu senden, sollte es in Ihrem form_for erzeugt werden, so dass ich denke, Ihr Ajax sendet es einfach nicht.

Falls es nicht automatisch generiert wird, können Sie es manuell tun: <%= hidden_field_tag :authenticity_token, form_authenticity_token %>

+0

Wo genau in der Form sollte ich diese Zeile setzen? – Arif

0

Es sei denn, config.action_view.embed_authenticity_token_in_remote_forms auf true gesetzt ist (die Standardeinstellung ist false), Rails wird den versteckten Eingang mit dem csrf Token, wenn die Form nicht erzeugen ist ein entfernter.

Dies ist, weil ajax powered Forms einen anderen Mechanismus haben, um das Token zu erhalten & diese Änderung bedeutet, dass Sie nun cache html mit diesem Formular fragmentieren können, weil es nicht mehr Inhalt enthält, der sich für jeden Benutzer ändert.

Dieser Mechanismus fügt den Metatags der Seite den csrf-Tag hinzu, den die Rails JavaScript lesen und zur Ajax-Anfrage hinzufügen kann. Es gibt einen Helfer, csrf_meta_tags, der das für Sie tut - fügen Sie einfach einen Anruf dazu in der des html, das Sie rendering (das wird normalerweise in Ihrer Layout-Datei sein).

+0

Anscheinend habe ich schon 'csrf_meta_tags' in der Layoutdatei (ich muss es vorher übersehen haben). Ich habe '' authenticity_token => true' in das Formular eingefügt und das hat den Fehler beseitigt. Aber jetzt ist das Problem jedes Mal, wenn ich einen Kommentar hinzufüge, lädt es die ganze Seite neu, genau wie es vor Ajax war. – Arif

+0

Ist überhaupt eine Ajax-Anfrage passiert? klingt wie Sie möglicherweise nicht die Schienen Javascript geladen –

+0

Ajax arbeitete, bevor es plötzlich begann, die Authentizität Fehler werfen, so dass ich rate das Javascript ist geladen. Wenn nicht, wie stelle ich sicher, dass es ist? So sieht das Formular jetzt aus: '= form_for ([post, post.comments.build],: authenticity_token => true, remote: true) do | f |' – Arif

Verwandte Themen