2011-02-14 55 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