it-swarm.com.de

Rails 3 - Beschränken der Formate für Aktionen in Ressourcenrouten

Ich habe eine Ressource in meinen Routen definiert.

resources :categories

Und ich habe folgendes in meinem Category-Controller:

  def show
    @category = Category.find(params[:id])

    respond_to do |format|
      format.json { render :json => @category }
      format.xml  { render :xml => @category }
    end
  end

Die Controller-Aktion funktioniert gut für Json und XML. Ich möchte jedoch nicht, dass der Controller auf Anfragen im HTML-Format reagiert. Wie kann ich nur Json und XML zulassen? Dies sollte nur in der Show-Aktion passieren.

Was ist der beste Weg, um dies zu erreichen? Gibt es auch gute Tipps zum DRYing des respons_to-Blocks?

Danke für Ihre Hilfe.

36
Mike

Ich fand, dass dies zu funktionieren schien (danke an @Pan für die richtige Richtung):

resources :categories, :except => [:show]
resources :categories, :only => [:show], :defaults => { :format => 'json' }

Das Obige scheint den Router dazu zu zwingen, eine formatlose Anfrage zu bedienen, um standardmäßig die Show-Aktion als Json auszuführen.

41
Mike

Sie müssen diese Routen in einen Bereich einschließen, wenn Sie sie auf ein bestimmtes Format beschränken möchten (z. B. HTML oder Json). Einschränkungen 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 aus meiner vorherigen Antwort hier kopiert ..

Rails-Routen - Beschränken der verfügbaren Formate für eine Ressource

35
koonse

Sie können in der Datei routes.rb Folgendes tun, um sicherzustellen, dass nur die Aktion show auf json oder xml beschränkt ist:

resources :categories, :except => [:show]
resources :categories, :only => [:show], :constraints => {:format => /(json|xml)/}

Wenn dies nicht funktioniert, können Sie die Aktion explizit zuordnen:

resources :categories, :except => [:show]
match 'categories/:id.:format' => 'categories#show', :constraints => {:format => /(json|xml)/}
24
Pan Thomakos

constraints funktionierte nicht für POST -Anfragen und dann versuchte ich, dass defaults für alle funktioniert.

namespace :api, :defaults => { :format => 'json' } do
    namespace :v1 do
      resources :users do
        collection do
          get 'profile'
        end
      end
      post 'signup' => 'users#create'
      post 'login' => 'user_sessions#create'
  end
end

Ich habe Rails 4.2.7 verwendet

0
A H K