Ausführen des Curl-Befehls in einer Schienenanwendung

1638
mohammad shahbaz Khan

Ich versuche, einen Curl-Befehl in meiner Rails-Anwendung auszuführen. Meine Rails-Anwendung erstellt einfach ein Ticket und dazu muss ich einige Informationen eingeben.

Wenn die Person auf Speichern klickt, werden die in der DB eingegebenen Daten gespeichert. Jetzt versuche ich, ein Curl-Skript auszuführen, wenn ein Benutzer auf Speichern klickt.

**tickets_controller.rb**  Code without Curl Script:  def create @ticket = Ticket.new(ticket_params)  respond_to do |format| if @ticket.save format.html { redirect_to @ticket, notice: 'Ticket was successfully created.' } format.json { render :show, status: :created, location: @ticket } else format.html { render :new } format.json { render json: @ticket.errors, status: :unprocessable_entity } end end end  

Wenn ich auf Speichern klicke, werden Daten in meine Datenbank eingefügt und dies in der Protokolldatei angezeigt:

 Started POST "/tickets" for 127.0.0.1 at 2017-01-18 10:58:21 -0500 Processing by TicketsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"8L7gmdNZSJ389YpnyYsp4j5F+3lzaTQIP4fo+FZn6h9Qp6u2bA0cXstDLw2vX2fAPHCzKSgijwoDU0UHr+TT2g==", "ticket"=>{"record_id"=>"m2", "seat_id_seq"=>"m2", "address"=>"m2", "price_paid"=>"m2", "email_address"=>"m2"}, "commit"=>"Create Ticket"} (0.1ms) begin transaction SQL (0.4ms) INSERT INTO "tickets" ("record_id", "seat_id_seq", "address", "price_paid", "email_address", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) [["record_id", "m2"], ["seat_id_seq", "m2"], ["address", "m2"], ["price_paid", "m2"], ["email_address", "m2"], ["created_at", "2017-01-18 15:58:21.219802"], ["updated_at", "2017-01-18 15:58:21.219802"]] (181.4ms) commit transaction Redirected to http://localhost:3000/tickets/2 Completed 302 Found in 189ms (ActiveRecord: 181.9ms) 

Jetzt habe ich ein Curl-Skript, das tatsächlich Daten in ein anderes Projekt einfügt:

curl -F token='08F14AE57696E458BA6FC6A203F57E69' -F overwriteBehavior=normal -F content=record -F type=flat -F format=json -F data='[{"record_id":"bbc","seat_id_seq":"bbb","address":"bbb","price":"bbb","email":"bbb","tickets1_complete":"2"}]' 'https://cri-datacap.org/api/' 

Es funktioniert einwandfrei und fügt Daten in ein anderes Projekt ein, wenn ich diese Eingabeaufforderung ausführte. Jetzt füge ich diesen Code in meinem Rails-Projekt (Tickets) zusammen. Jedes Mal, wenn eine Person auf die Schaltfläche "Speichern" klickt, sollte dieses Skript ausgeführt werden und Daten in ein anderes Projekt eingeben.

def create @ticket = Ticket.new(ticket_params)  respond_to do |format| if @ticket.save %x{ curl -F token='08F14AE57696E458BA6FC6A203F57E69' -F overwriteBehavior=normal -F content=record -F type=flat -F format=json -F data='[{"record_id":"bbc","seat_id_seq":"bbb","address":"bbb","price":"bbb","email":"bbb","tickets1_complete":"2"}]' 'https://cri-datacap.org/api/' } format.html { redirect_to @ticket, notice: 'Ticket was successfully created.' } format.json { render :show, status: :created, location: @ticket } else format.html { render :new } format.json { render json: @ticket.errors, status: :unprocessable_entity } end end end  

Wenn ich nun diese Anwendung ausführe und auf die Schaltfläche "Speichern" klickt, wird das Ticket erstellt, und die Ticketdaten werden erfolgreich in die DB Rails_application eingegeben. Dieses Curl-Skript wird jedoch nicht erfolgreich ausgeführt und Daten werden in das andere Projekt eingefügt.

Hier ist die Logdatei:

 Started POST "/tickets" for 127.0.0.1 at 2017-01-18 10:56:13 -0500 Processing by TicketsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"foxFimIFUbuuG4OHc2ve5+6melaNL+PtemsM2tOihNTelQ6l3VEFeJmtJu0Vv5DF7JMyBtZkWO9Gv6ElKiG9EQ==", "ticket"=>{"record_id"=>"m1", "seat_id_seq"=>"m1", "address"=>"m1", "price_paid"=>"m1", "email_address"=>"m1"}, "commit"=>"Create Ticket"} (0.1ms) begin transaction SQL (96.3ms) INSERT INTO "tickets" ("record_id", "seat_id_seq", "address", "price_paid", "email_address", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) [["record_id", "m1"], ["seat_id_seq", "m1"], ["address", "m1"], ["price_paid", "m1"], ["email_address", "m1"], ["created_at", "2017-01-18 15:56:13.416939"], ["updated_at", "2017-01-18 15:56:13.416939"]] (243.2ms) commit transaction % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 796 100 12 100 784 30 2000 --:--:-- --:--:-- --:--:-- 2000 Redirected to http://localhost:3000/tickets/1 Completed 302 Found in 1039ms (ActiveRecord: 339.6ms) 

BEARBEITEN

Hey, jetzt läuft diese Abfrage und das Eingeben von Daten in das andere Projekt. Kann mir jemand vorschlagen, dass es eine Möglichkeit gibt, die Variablen anstelle von fest codierten Werten im Skript zu verwenden:

 %x{ curl -F token='08F14AE57696E458BA6FC6A203F57E69' -F overwriteBehavior=normal -F content=record -F type=flat -F format=json -F data='[{"record_id":"bbc2","seat_id_seq":"bbb","address":"bbb","price":"bbb","email":"bbb","tickets1_complete":"2"}]' 'https://cri-datacap.org/api/' } 

Wie kann ich in diesem Skript die Werte verwenden, die ich für mein Tickets-Rail-Projekt eingebe. Eigentlich möchte ich die Informationen abrufen, die Benutzer in die Textfelder auf meinem Rail-Projekt eingeben, zu einem anderen Projekt. Wenn der Benutzer auf die Informationen klickt, speichern Er hat eingegeben, sollte zu einem anderen Projekt DB gehen.

Variablen in meinem Schienenprojekt:

 def ticket_params params.require(:ticket).permit(:record_id, :seat_id_seq, :address, :price_paid, :email_address) end 
0

1 Antwort auf die Frage

0
Greg Tarsa

Du hast es fast geschafft. Sie müssen die einfachen Anführungszeichen in doppelte Anführungszeichen setzen, um die Ruby-Interpolation verwenden zu können, und dann alle Anführungszeichen in der Curl zu deaktivieren, damit sie in die letzte Zeichenfolge interpoliert werden. Es ist hässlich, sieht aber so aus:

 %x{ curl -F token='08F14AE57696E458BA6FC6A203F57E69'  -F overwriteBehavior=normal -F content=record -F type=flat  -F format=json  -F data="[{\"record_id\":\"#\", \"seat_id_seq\":\"#\", \"address\":\"#\", \"price\":\"#\", \"email\":\"#\", "\"tickets1_complete\":\"2\"}]" 'https://cri-datacap.org/api/' } 

Möglicherweise können Sie es auch etwas einfacher machen:

require 'json' h=[{ record_id: record_id, seat_id_seq: seat_id_seq, address: address, price: price_paid, email: email_address, tickets1_complete: 2 }] %x{ curl -F token='08F14AE57696E458BA6FC6A203F57E69' -F overwriteBehavior=normal -F content=record -F type=flat  -F format=json } + ['-F', "data=\"#\"", 'https://cri-datacap.org/api/'] 

Ich bin nicht in der Lage, dies vollständig zu machen, daher müssen Sie die Anführungszeichen möglicherweise noch ein wenig jonglieren. Dies ist jedoch die Idee.