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块?

谢谢你的帮助。

我发现这似乎工作(感谢@潘指着我在正确的方向):

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

以上似乎强制路由器服务一个无格式的请求,显示操作,作为默认的JSON。

如果你想限制它们到一个特定的格式(例如html或json),你必须把这些路由包装在一个范围内。 不幸的是,在这种情况下,限制条件并不像预期那样工作。

这是这样一个块的例子…

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

更多信息可以在这里find: https : //github.com/rails/rails/issues/5548

这个答案是从我以前的答案复制。

Rails路由 – 限制资源的可用格式

您可以在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)/} 

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