2016-05-04 12 views
0

Ich bin neu in AngularJS und Rails, und ich versuchte, eine Rails-Anwendung mit AngularJS zum AufbauRuby On Rails-Anwendung mit AngularJS über AJAX

und jetzt möchte ich eine POST-Anforderung tun, um gesendete Daten einfügen Datenbank

Activity-Controller

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 

Aktivität Kaffee 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 

Console log

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) 

ich eine Taste von erstellt ng Sie auf Testfunktion auslösen, aber ich habe Informationen wie Konsolenprotokoll, Wie kann ich es beheben?

+0

Mögliches Duplikat [Rails API-Design ohne Schutz CSRF deaktivieren] (http://stackoverflow.com/questions/7600347/rails-api-design-without-disabling-csrf-protection) –

Antwort

2

Es gibt eine große Antwort hier: Rails API design without disabling CSRF protection

Der Kern ist es, dass Sie die CSRF-Token in einem Cookie XSRF-TOKEN wie so genannte setzen können:

# In my ApplicationController 
after_filter :set_csrf_cookie 

def set_csrf_cookie 
    if protect_against_forgery? 
    cookies['XSRF-TOKEN'] = form_authenticity_token 
    end 
end 

Sie werden dann zu Überladung die verified_request? Methode in der Application aus den Token zu laden, wo Angular es zurück:

protected 

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

(lesen sie den Link, den ich inclu ded obwohl .. es gibt Vorbehalte, aber ich denke, dass Sie so etwas sowieso wollen ... im Grunde sollten Ihre Login-Aktionen nicht gegen csrf geschützt sein, aber andere potenziell destruktive Aktionen sollten. Sie könnten dies mit skip_before_filter erreichen.)

Ich hoffe, dass hilft!

+0

Große Antwort, viel besser als meins . –

+0

Danke! Nichts für ungut mit meinem Kommentar auf Ihre Antwort beabsichtigt, ich nur zusammenschrumpfen, wenn ich an die potenziellen Probleme denke ohne gehen. –

+0

Danke für die Antwort. Und jetzt habe ich eine neue Frage, ich habe Erfolg, um Daten in die Datenbank zu senden, aber warum kann ich die Daten nicht aktualisieren, es sei denn, ich aktualisiere Browser selbst? –

0

Ihr Problem ist eine Eigenschaft von Schienen, die entworfen sind, um so genannte "Cross Site Request Forgery" zu besiegen. Das Rails-Team hat dies ausführlich beschrieben on their website, aber im Grunde ist es ein generiertes Token, das sicherstellen soll, dass das Formular, das eine Anfrage an die Web-API generiert, das von Ihnen bereitgestellte Formular ist. Dies führt oft zu Problemen mit einzelnen AJAX-Apps.

Die "schnelle Lösung" wäre, CSRF zu deaktivieren, indem Sie so etwas zu Ihrem Controller hinzufügen.

protect_from_forgery :except => :create

hoffe, das hilft!

+0

Zwar ist es eine ‚schnelle Lösung‘, dass es Dinge passieren und entfernt den aktuellen Straßenblock macht, denke ich csrf ein paar Minuten von vorne Arbeit wert ist keine Probleme in der Chance zu vermeiden, dass Ihre Website/app genug populär wird werden ein Ziel. –

+1

Stimme nicht zu. CSRF lohnt sich für die Produktion Code zu halten um. –

0

Ich glaube, der schnellste Weg, dies zu erreichen, ist mit der Hilfsmethode form_authenticity_token.

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

Es gibt keine Notwendigkeit, CSRF zu deblen, die ich überhaupt nicht empfehle.