запуск команды curl внутри приложения rails

1572
mohammad shahbaz Khan

Я пытаюсь выполнить команду curl внутри моего приложения rails. Мое приложение rails просто создает заявку, и для этого мне нужно ввести некоторую информацию.

Когда человек нажимает кнопку Сохранить, он сохраняет данные, введенные в БД. Теперь я пытаюсь запустить скрипт curl всякий раз, когда пользователь нажимает кнопку Сохранить.

**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  

когда я нажимаю Сохранить, он вводит данные в мою БД и показывает это в файле журнала:

 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) 

Теперь у меня есть скрипт curl, который фактически вводит данные в другой проект:

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/' 

Он отлично работает и вводит данные в другой проект, когда я запускаю это в командной строке. Теперь я объединяю этот код в свой проект rails (tickets), и всякий раз, когда человек нажимает кнопку «Сохранить», этот сценарий должен выполняться и вводить данные в другой проект.

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  

Теперь, когда я запускаю это приложение и нажимаю кнопку «Сохранить», оно создает заявку и успешно вводит данные заявки в базу данных rails_application. Но он не выполняет этот скрипт curl и вводит данные в другой проект.

вот файл журнала:

 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) 

РЕДАКТИРОВАТЬ

Эй, теперь он выполняет этот запрос и вводит данные в другой проект. Может ли кто-нибудь подсказать мне, есть ли способ использовать переменные вместо жестко закодированного значения в сценарии:

 %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/' } 

В этом сценарии, как я могу использовать значения, которые я ввожу для моего проекта билетов рельсов. На самом деле я хочу получить информацию, которую пользователи вводят в текстовые поля в моем проекте рельсов, в другой проект ... всякий раз, когда пользователь нажимает сохранить информацию, которая он вошел должен перейти в другой проект БД.

переменные в моем проекте rails:

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

1 ответ на вопрос

0
Greg Tarsa

У вас почти есть это. Вам нужно изменить одинарные кавычки на двойные кавычки, чтобы вы могли использовать рубиновую интерполяцию, а затем экранировать все кавычки в завитке, чтобы они интерполировались в конечную строку. Это некрасиво, но выглядит примерно так:

 %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/' } 

Вы также можете сделать это немного более аккуратно, как это:

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/'] 

Я не могу этого сделать полностью, поэтому вам, возможно, придется немного больше манипулировать кавычками, но это идея.

Похожие вопросы