我的路线中定义了资源。
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阻止的好技巧吗?
感谢您的帮助。
答案 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}}