2011-01-26 23 views
34

Con il comportamento di default, la richiesta/messaggi /: id viene mappato su l'azione "show" con :format => "html". Sto usando alcuni elementi XHTML nel mio spettacolo d'azione che non vengono visualizzate correttamente a meno che il: content_type è impostato su XML. Attualmente sto ricevendo intorno a questo rendendo show.xml.erb e impostare manualmente la content_type come segue:Come impostare il formato predefinito per un percorso in Rails?

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

Questo sembra sciocco però. Come posso cambiare routes.rb in modo che/messaggi /: id viene instradato con format=>"xml"? Grazie.

+0

la tua domanda è confusa sul modello: hai trame o post? – tomeduarte

+0

oops, mi dispiace. il suo unico modello, chiamalo post. – Saucerful

risposta

76

formato predefinito per le richieste:

È possibile impostare il formato predefinito di una determinata route per xml utilizzando l'hash predefinito.

Esempi:

# 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' } 

E 'sempre una buona idea per cercare il official Ruby on Rails routing guide, è abbastanza in profondità e di una risorsa molto buona prima-stop per eventuali problemi di routing.

+9

Puoi anche impostare il formato predefinito per un namespace e così via: 'namespace: user,: defaults => {: format => 'json'}' –

+0

Impressionante. Senza il formato impostato come sopra, ricevevo 406 errori richiedendo xml anche se tutto il resto era bello nel controller. – Polsonby

19

Se si desidera solo per supportare un formato e trattare tutte le richieste come quel formato, è possibile utilizzare un filtro per modificarlo:

before_filter :set_format 

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

Questo codice di andare nel Controller? – Saucerful

+1

Sì. Se si sceglie di utilizzare questa soluzione piuttosto che la modalità di instradamento (consultare la mia risposta), è necessario impostare il filtro come metodo privato, per problemi di sicurezza. - nota che questo impone il formato come in cui il modo route non lo fa, imposta solo il valore predefinito. – tomeduarte

6

Rails 5: Nel vostro controller (ad esempio ApplicationController se tutto intero applicazione utilizza lo stesso formato) aggiungere seguente:

before_action :set_default_request_format 

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

Per Rails 4 e più anziani l'uso before_filter invece di before_action.

2

Sto trovando strano comportamento in Rails 5 se si utilizza questo:

{ format: :json } 

Nella tua config/routes.rb allora anche se JSON non è impostato nell'intestazione accettare, si costringe ancora la richiesta di una richiesta JSON , anche per prove di controller che hanno il set as: :html opzione. Non è davvero un grosso problema per me, quindi non ho intenzione di approfondire perché è così, ma se qualcuno lo capisce, fammelo sapere e aggiornerò questa risposta.

+0

Sto vedendo la stessa cosa. Piuttosto fastidioso. – turboladen

0

Se si desidera impostare il formato predefinito per un percorso, utilizzare defaults opzione:

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

Ma se si vuole far rispettare ogni richiesta di restituire un formato specifico, utilizzare constraints opzione:

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

Vedi la documentazione: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints

Problemi correlati