2017-01-12 2 views
0

Ich versuche eine plattformübergreifende Anforderung in Schienen durchzuführen.Die CSRF-Token-Authentizität auf Schienen für plattformübergreifende Anforderung kann nicht überprüft werden.

Mein HTML-Code ist: -

<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>Title</title> 
 
    <link type="text/css" rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.min.css"> 
 
    <link type="text/css" rel="stylesheet" href="bower_components/font-awesome/css/font-awesome.min.css"> 
 
    <link type="text/css" rel="stylesheet" href="css/style.css"> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
</head> 
 
<body> 
 
    <div class="container"> 
 
     <form class="new_batches" id="new_batch" accept-charset="UTF-8" > 
 
      <div class="well"> 
 
       <div class="form-group row"> 
 
        <label class="control-label col-md-2" for="name">Name </label> 
 
        <div class="col-md-4"> 
 
         <input class="form-control" id="name" placeholder="Enter Batch Name" type="text" > 
 
        </div> 
 
       </div> 
 

 
       <div class="form-group row"> 
 
        <label class="control-label col-md-2">Course ID</label> 
 
        <div class="col-md-4"> 
 
         <input class="form-control" id="course_id" placeholder="Enter Your Course ID" type="text" > 
 
        </div> 
 
       </div> 
 

 
       <div class="form-group row"> 
 
        <label class="control-label col-md-2">Start Date</label> 
 
        <div class="col-md-4"> 
 
         <input class=" form-control" id="start_date" placeholder="Enter Start Date" type="text" > 
 
        </div> 
 
       </div> 
 

 
       <div class="form-group row"> 
 
        <label class="control-label col-md-2"> End Date</label> 
 
        <div class="col-md-4"> 
 
         <input class="datepicker form-control" id="end_date" placeholder=" Enter End date" type="text" > 
 
        </div> 
 
       </div> 
 
       <div class="form-group row"> 
 
        <label class="control-label col-md-2">Status</label> 
 
        <div class="col-md-2"> 
 
         <input name="batch[status]" type="hidden" value="0"><input type="checkbox" value="1" checked="checked" id="batch_status"> Checked 
 
        </div> 
 
       </div> 
 

 
       <div style="margin-left: 110px;"> 
 
        <button type="submit" id="submit-button" class="btn btn-primary ">Submit</button> 
 
       </div> 
 
      </div> 
 
     </form> 
 
    </div> 
 
    <script src="bower_components/jquery/dist/jquery.min.js"></script> 
 
    <script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script> 
 
</body> 
 
</html> 
 
<script> 
 
\t $(document).ready(function(){ 
 
\t \t $.ajaxSetup({ 
 
\t \t headers: { 
 
\t \t  'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') 
 
\t \t } 
 
\t \t }); 
 
\t }) 
 
    $(document).ready(function() { 
 
     $('#submit-button').click(function() { 
 
      $.ajax({ 
 
\t \t \t  type: "POST", 
 
\t \t \t  url: "http://localhost:3000/batches", 
 
\t \t \t  beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))}, 
 
\t \t \t  xhrFields: { 
 
\t \t \t  \t withCredentials: true 
 
\t \t \t \t }, 
 
\t \t \t  data: {  
 
        batch: { 
 
         name: $("#name").val(), 
 
         course_id: $("#course_id").val(), 
 
         start_date: $("#start_date").val(), 
 
         end_date: $("#end_date").val(), 
 
         status: $("#batch_status").val(), 
 
         } 
 
\t \t \t  }, 
 
\t \t \t  dataType: "JSON", 
 
\t \t \t error: function(error) { 
 
\t \t \t \t \t console.log(error); 
 
\t \t \t   }, 
 
\t \t \t success: function(data) { 
 
\t \t \t    console.log(data); 
 
\t \t \t    return false; 
 
\t \t \t   }, 
 
\t \t \t }) 
 
     }); 
 
    }) 
 
</script>

Und mein Backend-Code wie folgt lautet: -

class BatchesController < ApplicationController 
      def new 
      @batch = Batch.new 
      respond_to do |format| 
       format.json 
       format.html 
      end 
      end 

     def create 
     @batch = Batch.new(batch_param) 
     respond_to do |format| 
      if @batch.save 
      format.json { render json: @batch, status: :created, location: @batch } 
      format.html { redirect_to @batch, notice: "Save process completed!" } 
      else 
       format.html { 
       flash.now[:notice]="Save proccess coudn't be completed!" 
       render json: @batch.errors, status: :unprocessable_entity 
       } 
       format.json { render json: @batch.errors, status: :unprocessable_entity} 
      end 
     end 
     end 

    def batch_param 
      params.require(:batch).permit(:name, :course_id, :start_date, :end_date, :status) 
     end 

end 

Ich habe auch <% = csrf_meta_tag%> hinzugefügt myapplication.html.erb-Datei.

aber ich habe immer noch folgenden Fehler erhalten, wenn ich mein Formular absende. So kann mir jemand helfen, dieses Problem zu lösen.

Started POST "/batches" for 127.0.0.1 at 2017-01-12 20:11:12 +0545 
    ActiveRecord::SchemaMigration Load (0.6ms) SELECT "schema_migrations".* FROM "schema_migrations" 
Processing by BatchesController#create as HTML 
    Parameters: {"batch"=>{"name"=>"xyz", "course_id"=>"9", "start_date"=>"2016-12-12", "end_date"=>"2016-12-14", "status"=>"1"}} 
Can't verify CSRF token authenticity. 
Completed 422 Unprocessable Entity in 13ms (ActiveRecord: 0.0ms) 

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): 

Antwort

1

Wenn es sinnvoll ist, können Sie die csrf Token-Verifizierungs entfernen. Gerade diese

skip_before_action :verify_authenticity_token 
+0

Yeah es hat den Trick gemacht ... Aber jedes Mal, wenn ich versuche, es als html hinzuzufügen, aber antwortet nicht auf json ... so wie man es überkommt –

+0

Daten vom plattformübergreifenden Formular erhält submit und wird zur Datenbank auch hinzugefügt, aber nicht durch json Antwort .... eher durch HTML-Antwort –

+0

Sie möchten das Format einstellen, der Standardwert ist html. Es kann nur eine .js auf der URL benötigen. – Swards

0

in Ihren Ajax-Code, den Sie $('meta[name="csrf-token"]').attr('content')

verwenden, das heißt, dass Sie in ihr so ​​etwas wie dieses benötigen head-Tag

<meta content="code...=" name="csrf-token" /> 

die fehlt.

Sie können auch

<input type="hidden" name="csrf-token" value="code.."> 

zwischen Ihrem Formular-Tag

für csrf_code Besuch verwenden: Rails - How to add CSRF Protection to forms created in javascript?

+0

zu Ihrem Controller hinzufügen, was bedeutet „Code steht für –

+0

es csrf Token vom Server ist – codenut

+0

, wie man bekommen ... –

Verwandte Themen