2011-01-26 17 views
34

Przy domyślnym routingu, żądanie/posty /: id zostaje zmapowane do akcji "show" z :format => "html". Używam niektórych elementów xhtml w mojej akcji show, które nie są renderowane poprawnie, chyba że: content_type jest ustawione na xml. Ja obecnie poruszanie się to poprzez renderowanie show.xml.erb i ustawienie content_type ręcznie w następujący sposób:Jak ustawić domyślny format trasy w Railsach?

format.html { render :template => "/posts/show.xml.erb", 
      :locals => {:post => @post}, :content_type => "text/xml" } 

Wydaje się głupie choć. Jak mogę zmienić routes.rb, aby/posts /: id było routowane z format=>"xml"? Dzięki.

+0

Twoje pytanie jest mylące w odniesieniu do modelu: czy masz działki lub posty? – tomeduarte

+0

oops, przepraszam. jego jeden model, nazwij go postami. – Saucerful

Odpowiedz

76

domyślnego formatu wniosków:

Można ustawić domyślny format danej trasy do xml za pomocą skrótu domyślnego.

Przykłady:

# single match defaulting to XML (/plots/1 is the same as /plots/1.xml) 
match 'posts/:id' => 'posts#show', :defaults => { :format => 'xml' } 

# using resources, defaulting to XML (all action use XML by default) 
resources :posts, :defaults => { :format => 'xml' } 

# using resources and mixing with other options 
resources :posts, 
      :only => [:new, :create, :destroy], 
      :defaults => { :format => 'xml' } 

To zawsze dobry pomysł, aby przeszukać official Ruby on Rails routing guide, to dość dogłębne i bardzo dobrym źródłem pierwszy przystanek dla wszelkich problemów routingu.

+9

Można również ustawić domyślny format dla przestrzeni nazw i innych, takich jak: 'namespace: user,: defaults => {: format => 'json'}' –

+0

Awesome. Bez formatu ustawionego jak powyżej, otrzymywałem 406 błędów żądających xml, mimo że wszystko inne było fajne w kontrolerze. – Polsonby

19

Jeśli chcesz tylko do wspierania jednego formatu i traktować wszystkie wnioski jak tym formacie, można użyć filtru, aby go zmienić:

before_filter :set_format 

def set_format 
    request.format = 'xml' 
end 
+0

Czy ten kod znajduje się w kontrolerze? – Saucerful

+1

Tak. Jeśli zdecydujesz się użyć tego rozwiązania zamiast sposobu trasy (zobacz moją odpowiedź), powinieneś ustawić filtr jako prywatną metodę, dla każdego problemu bezpieczeństwa. - pamiętaj, że wymusza to format jako miejsce, w którym nie ma trasy, po prostu ustawia domyślne. – tomeduarte

6

Szyny 5 W kontrolerze (np ApplicationController jeśli wszystko cała aplikacja używa tego samego formatu) dodać następujące:

before_action :set_default_request_format 

    def set_default_request_format 
    request.format = :json unless params[:format] 
    end 

Dla Szyny 4 i starsze korzystania before_filter zamiast before_action.

2

jestem znalezieniem dziwne zachowanie w Rails 5, jeśli użyć tego:

{ format: :json } 

W swojej config/routes.rb wtedy nawet jeśli JSON nie jest ustawiony w nagłówku zaakceptować, to nadal wymusza żądanie do żądania JSON , w tym dla testów kontrolerów, które mają ustawioną opcję opcji as: :html. Nie jest to dla mnie wielka sprawa, więc nie zamierzam się zastanawiać, dlaczego tak jest, ale jeśli ktoś to wymyśli, daj mi znać, a ja zaktualizuję tę odpowiedź.

+0

Widzę to samo. Bardzo denerwujące. – turboladen

0

Jeśli chcesz ustawić domyślny format dla trasy, użyj defaults opcję:

resources :posts, defaults: { format: 'xml' } 

Ale jeśli chcesz wymusić każde żądanie powrotu do określonego formatu, użyj constraints opcję:

resources :posts, constraints: lambda { |req| req.format = 'xml' } 

Zobacz dokumentację: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints

Powiązane problemy