2011-06-06 10 views
11

Zastanawiam się tylko, jak szyny wie format żądania, aby poprawnie wpisać w słynnym:W jaki sposób szyny określają format przychodzącego żądania?

respond_to do |format| 
    format.html 
    format.xml 
    format.json 
end 

Jako przykład rozważ tę sytuację mam sprostała. Załóżmy, że za pośrednictwem javascript (jQuery) I uczynić żądanie POST expliciting Typ danych: json

$.ajax({ 
     type: 'POST', 
     url: 'example.com', 
     data: data, 
     dataType: 'json' 
    }); 

Gdy wniosek ten zasięg działania kontrolera, stojąc w środku z rubinem debugger, ja skontrolować @ request.format i widzę ten typ treści to application/json. Następnie kontroler odpowiada na format json zgodnie z oczekiwaniami.

Ale jestem zdezorientowany z symbolem formatu określonym na trasach. Załóżmy, że żądanie jest wysyłane na adres przyklad.com/parts.json, ale w żądaniu typem treści jest application/html lub application/xml. Czy kontroler odpowiada na format json lub html lub xml ??

Dzięki!

Odpowiedz

7

Od ActionController::MimeResponds: "Railsy określają pożądany format odpowiedzi z nagłówka HTTP Accept przesłanego przez klienta."

+0

Dzięki! Ale nie mogę już zrozumieć, co oznacza: symbol formatu, który pojawia się na routes.rb na przykład. Ponieważ jeśli wyślę żądanie do mojego serwera (na przykład GET /entities.xml) iw moim kontrolerze mam xml respond_to handler, nagłówek accept mówi app/XML w Google Chrome inspector. Jest coś w środku, czego nie rozumiałem już. Czy Rack jest tym, który widzi adres .xml w adresie URL i zgodnie z nim tworzy odpowiedni ŻĄDANIE z odpowiednimi nagłówkami akceptacji? Dzięki jeszcze raz! – flyer88

+2

Zasadniczo: xml jest jednym z zarejestrowanych typów mime https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/mime_types.rb W tym miejscu łączysz typ MIME z : symbol formatu. Ten symbol jest używany do wywoływania odpowiedniego renderera, który jest zarejestrowany w ActionController :: Renderers. – mikewilliamson

Powiązane problemy