2010-10-06 16 views
31

Ho questa impostazione:Come specificare ": layout => false" in Rails 'respond_with?

class UsersController < InheritedResources::Base 
    respond_to :html, :js, :xml, :json 

    def index 
    @users = User.all 
    respond_with(@users) 
    end 
end 

Ora sto cercando di fare in modo, se params[:format] =~ /(js|json)/, render :layout => false, :text => @users.to_json. Come faccio a farlo con respond_with o respond_to e inherited_resources?

+0

solo supposizioni, ma forse 'render false'? – Trip

risposta

44

Qualcosa di simile:

def index 
    @users = User.all 
    respond_with @users do |format| 
    format.json { render :layout => false, :text => @users.to_json } 
    end 
end 
17

O per evitare di dover codificare le risposte per ogni formato in ogni azione.

Se non hai layout per una qualsiasi delle azioni in questo controller sarebbe bello fare:

class UsersController < InheritedResources::Base 
    respond_to :html, :js, :xml, :json 
    layout false 

    def index 
    @users = User.all 
    respond_with(@users) 
    end 
end 
+0

In rails 3 usa layout: false - nil caricherà il layout predefinito. Vedi: http://stackoverflow.com/a/11355276/398696 – d3vkit

28

Se c'è bisogno di JSON per una richiesta Ajax

class UsersController < InheritedResources::Base 
    respond_to :html, :js, :xml, :json 

    def index 
    @users = User.all 
    respond_with(@users, :layout => !request.xhr?) 
    end 
end 

Questo mi sembra il soluzione più pulita per me.

8

amo @ soluzione di Anthony, ma non ha funzionato per me ... ho dovuto fare:

respond_with(@users) do |format| 
    format.html { render :layout => !request.xhr? } 
end 

ps: inviare una "risposta" al posto di un commento perché StackOverflow commento formattazione e " return key == submit "è esasperante!

1

È necessario impostare questa opzione sul proprio show.

def show 
    render :layout => !request.xhr? 
end 

:)

4

Ho appena trovato questo fuori:

Anche se è JSON, Rails sta ancora cercando un layout. Come tale, l'unico layout che trova, nel nostro caso, è application.html.

Soluzione: creare un layout JSON.

Così, per esempio, se si mette un vuoto application.json.erb con un unico = yield all'interno, accanto al tuo HTML uno, il layout HTML è migliorato dal JSON uno. Puoi persino usarlo per circondare il tuo JSON con metadati o cose del genere.

<%# app/views/layouts/application.json.erb %> 

<%= yield %> 

Nessun altro parametro necessario, funziona automagicamente!

testato in Rails 4 soltanto

+0

Testato in Rails 3, funziona bene. Anche se non è una risposta alla domanda posta, è ancora la risposta alla domanda che molti di noi intendono per reale. – lifecoder

+0

Funziona per me in Rails 4. Semplice e diretto. – emptywalls

+2

Ho appena controllato Rails 4.2. Se assegni il nome al file di layout 'application.html.slim', non verrebbe considerato come file di layout per json; chiunque, se dai il nome al file di layout come 'application.slim' ..allora * dovrebbe * essere trattato come file di layout per JSON. (sostituire slim con erb dovrebbe fare la stessa cosa). – songyy

3
class UsersController < InheritedResources::Base 
    layout -> (controller) { controller.request.xhr? ? false : 'application' } 
end 
Problemi correlati