16 Stimmen

Wie man die Ressourcenformate in der Rails-Routen-Datei einschränkt

Beim Routing von Ressourcen in Rails wird das optionale Format-Attribut automatisch an die generierten Routen angehängt. Dies dient dazu, dass die betreffende Ressource entweder als XML, HTML usw. angefordert werden kann. Welche Formate tatsächlich erlaubt sind, wird normalerweise im Controller mit respond_to .

Aber in vielen Fällen möchte man nur HTML unterstützen, und es scheint ein Overhead zu sein, die respond_to :html in jeder Aktion in jedem Controller. Es wäre daher cool, wenn es eine Möglichkeit gäbe, die erlaubten Inhaltstypen bereits beim Erstellen der Routen in der Datei routes.rb zu begrenzen, z.B.

map.resources :users, :formats => :html
map.resources :users, :formats => [:html, :xml]
map.resources :users, :formats => {:index => :html, :show => [:html, :xml]}

Gibt es eine Möglichkeit, dies entweder nativ oder über ein Plugin zu erreichen?

P.S. Der übliche Weg, dies zu umgehen, besteht darin, das Problem einfach zu ignorieren und nicht zu verwenden respond_to in den Aktionen. Dies schränkt jedoch die zulässigen Inhaltstypen nicht ein. Stattdessen wird lediglich erwartet, dass für jeden möglichen Inhaltstyp eine Vorlage im Verzeichnis views existiert. Wenn eine solche nicht vorhanden ist, wird ein HTTP 500-Fehler ausgegeben.

6voto

Peter Wagenet Punkte 4856

Da Rails das Äquivalent eines Platzhalters verwendet, um Formate ".:format" zu behandeln, ist es etwas schwieriger, Dinge auf der Routenseite zu verhindern.

Stattdessen ist es ziemlich einfach, alle Nicht-HTML-Anfragen in einem Vorher-Filter abzufangen. Hier ist eine Möglichkeit, wie dies aussehen könnte:

class ApplicationController < ActionController::Base
  before_filter :check_format

  private

    def check_format
      if request.format != Mime::HTML
        raise ActionController::RoutingError, "Format #{params[:format].inspect} not supported for #{request.path.inspect}"
      end
    end

end

ActionController::RoutingErrors werden als 404-Fehler behandelt, was sinnvoll ist. Für den Fall, dass Sie eine Aktion haben, die etwas anderes als HTML unterstützen muss, verwenden Sie einfach:

skip_before_filter :check_format, :only => ACTION_NAME

6voto

koonse Punkte 1487

Sie müssen diese Routen in einen Bereich einschließen, wenn Sie sie auf ein bestimmtes Format (z. B. html oder json) beschränken wollen. Constraints funktionieren in diesem Fall leider nicht wie erwartet.

Dies ist ein Beispiel für einen solchen Block...

scope :format => true, :constraints => { :format => 'json' } do
  get '/bar' => "bar#index_with_json"
end

Weitere Informationen finden Sie hier: https://github.com/rails/rails/issues/5548

Diese Antwort ist von meiner vorherigen Antwort hier kopiert.

Rails Routes - Begrenzung der verfügbaren Formate für eine Ressource

3voto

Ryan Bigg Punkte 104835

Ich glaube, dass Sie in der Lage sind, so etwas zu tun:

respond_to do |format|
  format.html
  format.json { render :json => @things }
  format.any { render :text => "Invalid format", :status => 403 }
end

Wenn der Benutzer html oder json anfordert, wird es so gemacht, wie es sollte, aber alles andere wird den Text "Ungültiges Format" anzeigen.

1voto

Mike Buckbee Punkte 6623

Würden Sie in beiden Fällen nicht einen HTTP 500-Fehler wünschen? Wie in der zweiten Zeile Ihres Beispiels, wenn jemand JSON anstelle von HTML oder XML angefordert hat, ist dann nicht ein Fehlercode die angemessene Antwort?

0voto

jemminger Punkte 5023

Als zu tun:

def some_action
  ...
  respond_to do |format|
    format.html
    format.json { whatever }
    format.any { whatever  }
  end
end

einfach benutzen:

def some_action
  ...
end

und Rails wird standardmäßig nach some_action.html.erb oder dem angeforderten Format suchen. Wenn Sie keine anderen Ansichten als html definieren, dann werden alle anderen Formate fehlschlagen, wenn sie angefordert werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X