ルートにリソースが定義されています。
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ブロックを乾燥させるための良いヒントはありますか?
ご協力いただきありがとうございます。
これは機能しているように見えました(正しい方向を示してくれた@Panに感謝します)。
resources :categories, :except => [:show]
resources :categories, :only => [:show], :defaults => { :format => 'json' }
上記は、デフォルトでjsonとして、ルータにフォーマットなしのリクエストをshowアクションに強制的に提供するように思われます。
これらのルートを特定の形式(htmlまたはjsonなど)に制限する場合は、それらのルートをスコープでラップする必要があります。残念ながら、この場合、制約は期待どおりに機能しません。
これはそのようなブロックの例です...
scope :format => true, :constraints => { :format => 'json' } do
get '/bar' => "bar#index_with_json"
end
詳細はここにあります: https://github.com/Rails/rails/issues/5548
この回答は、私の以前の回答のコピーです。
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