2016-05-13 5 views
0

Ich bin neu bei Ruby-on-Rails und ich arbeite derzeit an einem Projekt, mit dem sich ein Benutzer anmelden kann, erstellen Update löschen ein Marvel-Zeichen. Jeder Charakter hat einen Namen, eine Beschreibung, einen Ursprung, eine Allianz und ein Bild. Ich benutzte Carrierwave für den Datei-Upload.Rails: ActionController :: InvalidAuthenticityToken beim Hinzufügen eines Bildes

Ich benutzte den Scaffold Befehl und alles funktionierte gut, bis ich beschloss, meine Charaktere auf der gleichen Seite mit .js.erb Dateien zu erstellen und zu aktualisieren, anstatt den Benutzer auf 2 verschiedene Seiten umzuleiten Erstellen und das Update.

Ich habe den folgenden Fehler jedes Mal, wenn ich versuche, ein Zeichen mit einem Bild zu erstellen. alles funktioniert gut, wenn ich nicht ein Bild hinzufügen: Action :: InvalidAuthenticityToken

Ich weiß, dass es ein paar andere ähnliche Fragen sind bereits auf dem Forum gestellt, aber ich kann nicht die Antwort zu finden scheinen mein Problem.

Ich verwende Rails 4.2.6. Ich habe versucht, den Edelstein Remotipart hinzuzufügen, aber es hat mein Problem nicht behoben.

create.js.erb Code:

$("#characters").append("<%= escape_javascript(render @character)%>"); 

Aktion im Controller erstellen:

def create 
@character = Character.new(character_params) 

respond_to do |format| 
    if @character.save 
    format.html { redirect_to @character, notice: 'Character was successfully created.' } 
    format.json { render :show, status: :created, location: @character } 
    format.js 
    else 
    format.html { render :new } 
    format.json { render json: @character.errors, status: :unprocessable_entity } 

    end 
end 

Ende

Ich hoffe, dass ich genug Informationen, Dank im Voraus!

Edit:
Hier ist der Code, den ich in der form.html.erb haben, dass die Benutzer hinzufügen, ein Bild lassen:

<div class="field"> 
    <%= f.label :image %> 
    <%= f.file_field :image %> 
    <% if f.object.image %> 
     <%= image_tag f.object.image.url %> 
     <!--<%= f.label :remove_image %> 
    <%= f.check_box :remove_image %> --> 
    <% end %> 
    </div> 
+0

Könnten Sie zeigen uns dann v iew enthält das Formular? – Fred

Antwort

-2
skip_before_action :verify_authenticity_token 

Setzen Sie diese in Ihrem Controller

+0

Vielen Dank, es funktioniert! Ich kann nicht glauben, dass es so einfach war ... Könnten Sie vielleicht eine weitere Erklärung geben, warum mein Programm diese Codezeile jetzt benötigt, aber ohne es vorher gut funktionierte? Ich schätze Ihre Antwort, aber ich möchte diese Linie nicht einfach überschreiten, ohne sie zu verstehen und die Auswirkungen zu kennen. Danke –

+0

authenticity_token wird verwendet, so dass, wenn Parameter an den Server übergeben werden sie authentifiziert sind und der Server weiß, dass sie das sind, was erwartet wird. Einige Edelsteine ​​verwenden jedoch Daten, die durch dieses Token nicht "gültig" sind. Es ist keine gute Angewohnheit, diese Art von Skips zu machen, aber manchmal muss es getan werden und ich habe es bei einigen meiner Apps gemacht. Sie müssen nur wissen, was Sie gerade tun. – Boltz0r

+0

Umgehung der Sicherheit ohne zu verstehen, was gerade passiert Die angenommene Pseudoantwort hilft ihm auf lange Sicht nicht. – Fred

2

Ich denke, Ihre Rails Formen werden nun nicht die CSRF-Feld in der Render Form:

<%= form_for @character, :remote => true, :authenticity_token => true,:multipart => true do |f| %> 

..... 

<% end %> 
+0

form_for standardmäßig bereits das auth_token einbetten – Fred

+0

Funktioniert für mich mit Rails 5.1, Remote Form (simple_form) und CarrierWave ohne Remotipart. –