2010-09-09 11 views
21

Ho una serie di risorse che desidero solo disponibili se si accede tramite il formato JS. Le risorse di percorso di Rails mi forniscono i formati più l'HTML standard. C'è un modo per specificare che devono essere creati solo i percorsi in formato JS?Rails Rails - Limitazione dei formati disponibili per una risorsa

+1

Quale versione di Rails stai usando? – Garrett

+2

Puoi accettare la mia risposta qui sotto, è quella giusta, la risposta selezionata corrente è sbagliata e confonde la comunità. – koonse

risposta

16

Basta aggiungere vincoli sul formato:

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

A meno che non stia facendo qualcosa di sbagliato, che mi consente comunque di accedere a/photos come: html. Ricevo il messaggio modello mancante, quando mi aspetto un'eccezione di percorso mancante. Pensieri? –

+0

Non dovrebbe essere '/ (js | json) /'? – Garrett

+0

Sì, l'ho preso e l'ho cambiato. Ancora non funziona per me. Ho risorse: membri,: controller => 'case/membri',: constraints => {: format =>/js /} –

-1

è possibile utilizzare un before_filter che solleva un errore di routing a meno che il formato della richiesta è 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 

applicare il filtro più chirurgicamente con :only, :except, e :skip_before_filter come coperto nelle rotaie Action Controller Guide

+0

I ' Ho usato un approccio simile per gestire questo tipo di problema https://github.com/marcusg/force_format – marcus3006

51

Devi avvolgere quelle rotte in un ambito. I vincoli purtroppo non funzionano come previsto in questo caso.

Questo è un esempio di un tale blocco ...

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

Maggiori informazioni si possono trovare qui: https://github.com/rails/rails/issues/5548

+4

Questo dovrebbe essere contrassegnato come risposta. –

+3

Se si utilizza 'risorse', non è necessario un blocco di ambito, basta aggiungere': format => true' e ': constraints => ...' direttamente alla chiamata 'resources'. – Nathan

+0

Questo ha funzionato nel mio caso per un percorso pieno di risorse.'risorse: foto, formato: true, vincoli: 'json'' – maicher

0

come su

# routes.rb 

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

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

non ottiene al controllore del tutto Tratto da railsadventures

0

Se è necessario non solo uno o l'altro di json (uso gergo #xhr?) Offro a voi delle seguenti opzioni

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

Spero che sia utile

Problemi correlati