Мне нужно запросить некоторые данные из веб-сервиса SOAP API (XML) в приложении Rails 4. Пользователь вводит свой адрес электронной почты и номер подтверждения и получает кучу информации о своем бронировании.Запрос/ответ на приложение Soap API в Rails
Это работало в отдельном приложении, которое я создал, не указав правильные маршруты и используя <%= form_tag(root_url, :method => :get) %>
в виде индекса. Готовому приложению будет нужна правильная структура маршрута, но я не могу получить никакого ответа от API Soap, когда я ставлю <%= form_tag('searches/show', :method => :get) %>
в качестве своего нового приложения. (Я просто получаю пустой экран, тогда как старая версия работала нормально)
В настоящее время я направляюсь из индекса на страницу показа с использованием жесткой строки. Я знаю, что это, вероятно, не самая лучшая практика, но поскольку это вызов информации из Soap API, не нужно быть базой данных за Rails-приложением. (Несмотря на то, что я поместил его в любом случае)
В любом случае, заблаговременно за вашу помощь, вот все разделы моего приложения, которые, на мой взгляд, актуальны сейчас. Дайте мне крик, если вам нужна дополнительная информация!
Index View (/views/searches/index.html.erb):
<h1>Manage your Booking</h1>
<p>
<%= form_tag('searches/show', :method => :get) %>
<%= label_tag 'Confirmation Number:' %>
<%= text_field_tag :confirmation_number %>
<%= label_tag 'Email:' %>
<%= text_field_tag :email %>
<%= submit_tag "Lookup", name: nil %>
</p>
Show View (/views/searches/show.html.erb)
<% if @search %>
<dl id ="reservation_info">
<dt>Test Text:</dt>
<dd><%= @search.reservation_id %></dd>
<dd><%= @search.dining_date_and_time %></dd>
<dd><%= @search.size %></dd>
<dd><%= @search.session_id %></dd>
<dd><%= @search.first_name %></dd>
<dd><%= @search.last_name %></dd>
<dd><%= @search.confirm_number %></dd>
<dd><%= @search.allowed_to_cancel_online %></dd>
<dd><%= @search.restaurant_phone_number %></dd>
<dd><%= @search.restaurant_id %></dd>
<dd><%= @search.restaurant_name %></dd>
<dd><%= @search.location_id %></dd>
<dd><%= @search.location_name %></dd>
</dl>
<% end %>
контроллер (контроллеры /searches_controller.rb)
class SearchesController < ApplicationController
def index
if params[:confirmation_number] && params[:email]
@search = Search.new params[:confirmation_number], params[:email]
end
end
private
def search_params
params.require(:search).permit(:confirmation_number, :email)
end
end
Routes config file:
Rails.application.routes.draw do
resources :reservations do
end
resources :searches do
end
end
Модель (модели/search.rb):
class Search < ActiveRecord::Base
attr_accessor :reservation_id, :dining_date_and_time, :size, :session_id, :first_name, :last_name, :confirm_number, :allowed_to_cancel_online, :restaurant_phone_number, :restaurant_id, :restaurant_name, :location_id, :location_name
def client
client = Savon.client(wsdl: "http://wsdl-example-url-placeholder?wsdl", follow_redirects: :follow_redirects)
end
def initialize(confirmation_number, email)
message = {'ConfirmationNumber' => confirm_number, 'EMail' => email }
response = client.call(:search_for_reservation, message: message)
if response.success?
data = response.to_array(:search_for_reservation_response, :reservation).first
if data
@reservation_id = data[:@id]
@dining_date_and_time = data[:dining_date_and_time]
@size = data[:size]
@session_id = data[:session_id]
@first_name = data[:first_name]
@last_name = data[:last_name]
@confirm_number = data[:confirmation_number]
@allowed_to_cancel_online = data[:allowed_to_cancel_online]
@restaurant_phone_number = data[:restaurant_phone_number]
data2 = response.to_hash[:search_for_reservation_response][:reservation][:restaurant]
if data2
@restaurant_id = data2[:@id]
@restaurant_name = data2[:name]
data3 = response.to_hash[:search_for_reservation_response][:reservation][:restaurant][:location]
if data3
@location_id = data3[:@id]
@location_name = data3[:name]
end
end
end
end
end
выходной терминал:
Started GET "/searches" for ::1 at 2015-07-08 14:39:56 +0100
ActiveRecord::SchemaMigration Load (1.4ms) SELECT "schema_migrations".* FROM "schema_migrations"
Processing by SearchesController#index as HTML
Rendered searches/index.html.erb within layouts/application (2.9ms)
Completed 200 OK in 296ms (Views: 285.8ms | ActiveRecord: 0.0ms)
Started GET "/searches" for ::1 at 2015-07-08 14:39:56 +0100
Processing by SearchesController#index as HTML
Rendered searches/index.html.erb within layouts/application (0.3ms)
Completed 200 OK in 48ms (Views: 47.7ms | ActiveRecord: 0.0ms)
Started GET "/searches/show?utf8=%E2%9C%93&confirmation_number=ZANHJW5U&email=myemail%40email.com" for ::1 at 2015-07-08 14:40:06 +0100
Processing by SearchesController#show as HTML
Parameters: {"utf8"=>"✓", "confirmation_number"=>"ZANHJW5U", "email"=>"[email protected]", "id"=>"show"}
Rendered searches/show.html.erb within layouts/application (0.5ms)
Completed 200 OK in 49ms (Views: 48.2ms | ActiveRecord: 0.0ms
Кажется, что это проблема при маршрутизации на другие страницы, такие как страница показа. Когда вы просто устанавливаете поиск/индекс как root и указываете в представлении (root_url,: method =>: get), он отлично работает. Активная запись вообще не влияет на нее. Почему запрос на мыло не работает, когда я пытаюсь перейти на другую страницу? – daneasterman