2009-07-28 20 views
40
  1. Użytkownik przesyła formularz z podstawowymi danymi.Prześlij dane POST z kontrolera do innej witryny w Railsach

  2. Dane są odbierane i traktowane przez działanie w kontrolerze i dodawane są dodatkowe informacje, które muszą pozostać prywatne.

  3. Następnie muszę wysłać prośbę o dodanie do zewnętrznej strony internetowej z wszystkimi połączonymi danymi z kontrolera.

Jaki jest najlepszy sposób na zrobienie tego?

Odpowiedz

72

Najprostszym sposobem jest użycie rdzenia Ruby Biblioteka:

require "uri" 
require "net/http" 

params = {'box1' => 'Nothing is less important than which fork you use. Etiquette is the science of living. It embraces everything. It is ethics. It is honor. -Emily Post', 
'button1' => 'Submit' 
} 
x = Net::HTTP.post_form(URI.parse('http://www.interlacken.com/webdbdev/ch05/formpost.asp'), params) 
puts x.body 

Pro Porada: Wykonaj asynchroniczne żądanie za pomocą klejnotu, takiego jak delayed_job lub background_rb

Przykład zaczerpnięty z: http://biodegradablegeek.com/2008/04/how-to-post-form-data-using-ruby/

+2

Przykład użycia delayed_job na raporcie Ryana: http://railscasts.com/episodes/171-delayed-job –

+3

To była pierwsza rzecz, którą próbowałem. Niestety daje mi błąd "końca pliku". Od poszukiwania dookoła wydaje się, że inni mieli podobne problemy. Ktoś ma jakieś spostrzeżenia? –

+0

Aby rozwiązać problem błędu EOF podczas korzystania z https, zobacz http://stackoverflow.com/a/9227933/1161743 –

4

Nie sądzę, że przekierowuję_do obsługi żądań pocztowych, ponieważ używa on http 302 (?), Który POZWALA przejść na drugą stronę.

Wierzę, że można zrobić coś takiego

Class MyController < ActionController 
    require 'net/http' 

    def my_method 
     #do something with the data/model 

     my_connection = Net::HTTP.new('www.target.com', 80) 
     reponse = my_connection.post(path_within_url, data) 

     #do something with response if you want 
    end 

end 

Uwaga: To jest powietrze kodowane i nie został wypróbowany i przetestowany

29

Przykro mi, zapomniałem wspomnieć, że łączyłem się z bezpiecznym serwerem. Wydaje się, że spowodowałem, że kończyły się błędy plików. Dodanie za pomocą "net/https" i wywołanie use_ssl przy połączeniu rozwiązało problem. Dzięki za pomoc dla każdego.

require 'net/https' 
require 'open-uri' 

url = URI.parse('https://MY_URL') 
req = Net::HTTP::Post.new(url.path) 
req.form_data = data 
req.basic_auth url.user, url.password if url.user 
con = Net::HTTP.new(url.host, url.port) 
con.use_ssl = true 
con.start {|http| http.request(req)}  

Jest to oparte na źródle metody post_form, więc myślę, że dam vlad.zloteanu odpowiedź.

+0

:) dobrze .. 10qu, cieszę się, że pomogło ci. –

+1

Wydaje się, że działa świetnie, jednak oczekiwałem, że kontroler będzie śledził przekierowanie również na pocztę, ale wydaje się, że tak nie jest. Masz jakiś pomysł, jak to zrobić? – Alex

+1

Coś, co właśnie wypracowałem ... ustawiając ostatnią linię na odpowiedź 'res = con.start {| http | http.request (req)} 'jest użyteczne. – Isaac

12

Jeśli serwer zewnętrzny jest typu REST, wystarczy utworzyć model ActiveResource, aby obsłużyć dane.

Powiązane problemy