2011-02-14 67 views
36

我在我的路由中定義了一個資源。Rails 3 - 限制資源路由中的操作格式

resources :categories 

而且我在我的類別控制器以下:

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

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

控制器行動工作正常JSON和XML。但是,我不希望控制器響應html格式請求。我如何只允許json和xml?這應該只在演出中發生。

達到此目的的最佳方法是什麼? 還有什麼好的技巧來幹掉respond_to塊?

感謝您的幫助。

回答

40

我發現,這似乎工作(感謝@Pan指着我在正確的方向):

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

上述內容似乎強制路由器將默認情況下的json轉換爲show動作。

23

你可以做你的routes.rb文件中的下列以確保只有show動作被限制爲JSON或XML:

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

如果這不起作用,你可以嘗試明確配套措施:

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

對不起,這似乎沒有工作。請求一個html頁面仍然有迴應。 – Mike 2011-02-14 22:34:58

+0

如果第一個選項不適用於您,我添加了另一個更明確的替代選項。 – 2011-02-14 23:06:59

+1

感謝您的提示 – Fivell 2011-03-14 18:27:31

34

如果您想將它們限制爲特定格式(例如html或json),您必須將這些路由包含在範圍中。不幸的是,這種情況下的約束條件並不像預期的那樣工作。

這是這樣一個塊的例子...

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

更多信息可以在這裏找到:https://github.com/rails/rails/issues/5548

這個答案是我以前在這裏的答案抄..

Rails Routes - Limiting the available formats for a resource

0

constraints不適用於POST請求,然後我嘗試defaults它適用於所有。

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 

我用Rails 4.2.7