Rails 3 - 限制资源路由中的操作格式

时间:2011-02-14 22:02:34

标签: ruby ruby-on-rails-3 resources routes dry

我的路线中定义了资源。

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?这应该只在show动作中发生。

实现这一目标的最佳方法是什么? 还有任何关于干掉respond_to阻止的好技巧吗?

感谢您的帮助。

4 个答案:

答案 0 :(得分:41)

我发现这似乎有效(感谢@Pan指出我正确的方向):

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

上面的内容似乎强制路由器默认为json作为show action,提供无格式请求。

答案 1 :(得分:36)

如果要将这些路由限制为特定格式(例如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

答案 2 :(得分:24)

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

答案 3 :(得分:0)

defaults无法处理POST请求,然后我尝试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

我正在使用{{1}}