2010-09-09 7 views
21

Tengo una serie de recursos que solo quiero que estén disponibles si se accede a través del formato JS. Los recursos de ruta de Rails me dan los formatos más el HTML estándar. ¿Hay alguna manera de especificar que solo se creen las rutas de formato JS?Rutas de carriles: limitación de los formatos disponibles para un recurso

+1

¿Qué versión de Rails está utilizando? – Garrett

+2

¿Puede aceptar mi respuesta a continuación, es la correcta, la respuesta seleccionada actual es incorrecta y confunde a la comunidad. – koonse

Respuesta

16

Usted acaba de añadir restricciones sobre el formato:

resources :photos, :constraints => {:format => /(js|json)/} 
+0

A menos que esté haciendo algo mal, eso todavía me permite acceder a/fotos como: html. Aparece el mensaje de plantilla faltante, cuando esperaba una excepción de ruta faltante. ¿Pensamientos? –

+0

¿No debería ser '/ (js | json) /'? – Garrett

+0

Sí, capté eso y lo cambié. Aún no funciona para mí. Tengo recursos: miembros,: controller => 'homes/members',: constraints => {: format =>/js /} –

-1

Se puede utilizar un before_filter que genera un error de enrutamiento menos que el formato de la petición es MIME::JS.

app/controllers/application_controller.rb:

class ApplicationController < ActionController::Base 
    before_filter :check_js 

    private 
    def check_js 
     raise RoutingError.new('expected application/json') unless request.format == MIME::JS 
    end 
end 

Aplicar este filtro más quirúrgicamente con :only, :except y :skip_before_filter como cubiertos en los carriles Action Controller Guide

+0

I ' Hemos utilizado un enfoque similar para manejar este tipo de problema https://github.com/marcusg/force_format – marcus3006

51

Debe envolver esas rutas en un ámbito. Restricciones desafortunadamente no funcionan como se esperaba en este caso.

Este es un ejemplo de un bloque de este tipo ...

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

Más información se puede encontrar aquí: https://github.com/rails/rails/issues/5548

+4

Esto debe marcarse como la respuesta. –

+3

Si está utilizando 'resources', no necesita un bloque de ámbito, simplemente agregue': format => true' y ': constraints => ...' directamente a la llamada 'resources'. – Nathan

+0

Esto funcionó en mi caso para una ruta ingeniosa.'resources: photos, format: true, constraints: 'json'' – maicher

0

¿qué tal

# routes.rb 

class OnlyAjaxRequest 
    def matches?(request) 
    request.xhr? 
    end 
end 

post "/test/suggestions", to: "test#suggestions", :constraints => OnlyAjaxRequest.new 

que no llega a la controlador en absoluto. Tomado de railsadventures

0

Si necesita no sólo una u otra de json (uso no puede #xhr?) Te ofrezco opción a continuación

resource :offers, only: :show, format: true, constraints: { format: 'pdf' }

Espero que ayude

Cuestiones relacionadas