with tutorial scotch rails only guia crear before_action ruby-on-rails json redirect restriction rails-api

ruby on rails - tutorial - Rieles: restringe las solicitudes de la API al formato JSON



rails before_action (3)

Establecer un valor predeterminado en sus rutas no convertirá todas las solicitudes en una solicitud JSON.

Lo que quieres es asegurarte de que lo que estás renderizando sea una respuesta JSON

Casi lo tenía en la primera opción, excepto que necesita hacer esto

before_filter :set_default_response_format private def set_default_response_format request.format = :json end

Eso pasaría bajo su controlador Base API para que cuando llegue a su acción real, el formato siempre sea JSON.

Me gustaría restringir las solicitudes a todos los controladores API para que sean redirigidos a la ruta JSON. Me gustaría utilizar una redirección ya que también la URL debería cambiar según la respuesta.
Una opción sería usar un before_filter que redirecciona la solicitud a la misma acción pero obliga al formato JSON. ¡El ejemplo no está funcionando todavía!

# base_controller.rb class Api::V1::BaseController < InheritedResources::Base before_filter :force_response_format respond_to :json def force_response_format redirect_to, params[:format] = :json end end

Otra opción sería restringir el formato en la configuración de rutas.

# routes.rb MyApp::Application.routes.draw do namespace :api, defaults: { format: ''json'' } do namespace :v1 do resources :posts end end end

Quiero que todas las solicitudes terminen como una solicitud JSON:

http://localhost:3000/api/v1/posts http://localhost:3000/api/v1/posts.html http://localhost:3000/api/v1/posts.xml http://localhost:3000/api/v1/posts.json ...

¿Qué estrategia recomendarías?


Segunda opción, utilizando el formato de rutas. Si un usuario solicita explícitamente un formato XML, no debería recibir una respuesta JSON. Debería recibir un mensaje que diga que esta URL no responde al formato XML, o 404.

Por cierto, sería bastante fácil responder a todo lo que debería hacer en mi opinión.

class FooController respond_to :xml, :json def show @bar = Bar.find(params[:id]) respond_with(@bar) end end


Si desea devolver un 404 o generar un error de RouteNotFound si el formato no es :json , agregaría una restricción de ruta como esta:

Requiere formato JSON:

# routes.rb MyApp::Application.routes.draw do namespace :api, constraints: { format: ''json'' } do namespace :v1 do resources :posts end end end

Puede encontrar más información aquí: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints