2011-07-23 7 views
5

RoR noobem tutaj ... :)plik wpis jest jako multipart/form-data do Rails API

muszę stworzyć Rails API, które klienci mogą zadzwonić i wysłać plik XML za pośrednictwem żądania POST.

mam stworzyć swoją trasę tak:

namespace :api do 
     namespace :v1 do 
     resource :report 
     end 
    end 

i mojego kontrolera takiego:

class Api::V1::ReportsController < ApplicationController 

    respond_to :xml 

    def create 
    @report_submission = ReportSubmission.create :login => params[:login], 
               :status => :success 
    respond_with(@report_submission) 
    end 
end 

Co muszę zrobić w sterowniku, aby odebrać plik XML, który klient będzie publikować, a następnie czytać treści, więc mogę ostatecznie umieścić go w bazie danych?

Jak mogę to sprawdzić?

Stworzyłem projekt piaskownicy, aby wypróbować to i utknąłem ... nie mam pojęcia, co dalej robić. Mam pchnął go tutaj:

https://github.com/claudiolassala/api-samples/

Każda pomoc będzie po prostu niesamowite! koniec

Odpowiedz

0

Trzeba zrobić absolutnie nic oprócz podejmowania absolutnie 100% pewności, że jakiekolwiek dane, które są wysłane nie jest szkodliwa :) trasy Restfull daje hash params w akcji kontrolera w normalny sposób podczas wysyłania xml. Dokładnie tak działa ActiveResource Po prostu odpytuj swoje parametry w normalny sposób.

Jedynym potencjalnym problemem jest to, że Rails oczekuje poprawnie sformatowanego xml, aby to zadziałało.

Najprostszym sposobem, aby sprawdzić, co się dzieje, spróbuj opublikować plik xml do swojego działania i obejrzeć z bliska w pliku dziennika w params kontroler otrzymuje

http://apidock.com/rails/ActiveResource/Base Pokazuje, jak to działa w dość dobrej szczegółowości (nie, nie muszę być delegowania xml za pośrednictwem obiektu ActiveResource)

Jeśli chodzi o testowanie dotyczy Ryan Bates ma wielką Railscast na ActiveResource tutaj http://railscasts.com/episodes/94-activeresource-basics a tu http://railscasts.com/episodes/95-more-on-activeresource

są stare odlewy ale nadal całkowicie poprawny i y możesz dokładnie sprawdzić, jak przetestować

+0

Świetnie. To pomaga. Dzięki! –

4

Po wykonaniu kilku badań, udało mi się zrobić to działa. Zaktualizowałem my repository na GitHub z rozwiązaniem.

Główne zmiany były zmodyfikować moje kontrolera tak, aby odczytać zawartość pliku jest wysłana:

class Api::V1::ReportsController < ApplicationController 

    respond_to :xml 

    def create 

    @report_submission = ReportSubmission.create :login => params[:login], 
               :status => :success, 
               :results => read_file_data(params[:reportxml]) 
    respond_with(@report_submission) 
    end 

    private 
    def read_file_data(file) 
     xml_contents = "" 
     if file.respond_to?(:read) 
     xml_contents = file.read 
     elsif file.respond_to?(:path) 
     xml_contents = File.read(file.path) 
     else 
     logger.error "Bad file_data: #{file.class.name}: #{file.inspect}" 
     end 
     xml_contents 
    end 
end 

I Naprawiłem mój krok Ogórek, który wykonuje w słupek, zmieniając go w ten sposób:

When /^I send a POST request containing the file$/ do 
    @login = "some-login" 
    @file_path = "#{::Rails.root.to_s}/features/step_definitions/test_report.xml" 

    post "api/v1/report.xml?login=#{@login}", 
     :reportxml => Rack::Test::UploadedFile.new(@file_path, 'text/xml') 
end 

Proszę dać mi znać, czy istnieje lepszy sposób na zrobienie tego. Dzięki!

Powiązane problemy