2015-07-08 1 views
2

Мне нужно запросить некоторые данные из веб-сервиса 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 
+0

Кажется, что это проблема при маршрутизации на другие страницы, такие как страница показа. Когда вы просто устанавливаете поиск/индекс как root и указываете в представлении (root_url,: method =>: get), он отлично работает. Активная запись вообще не влияет на нее. Почему запрос на мыло не работает, когда я пытаюсь перейти на другую страницу? – daneasterman

ответ

1

Я думаю, что вы делаете запрос на searches/show странице однако вы не имеете действия для этого? У вас есть действие для индекса, поэтому измените форму, чтобы сделать запрос только searches. Это исправить?

Смежные вопросы