2010-10-06 6 views
31

J'ai cette configuration:Comment spécifier ": layout => false" dans Rails 'respond_with?

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

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

Maintenant, je suis en train de faire en sorte, si params[:format] =~ /(js|json)/, render :layout => false, :text => @users.to_json. Comment faire cela avec respond_with ou respond_to et inherited_resources?

+0

devine juste, mais peut-être 'render false'? – Trip

Répondre

44

Quelque chose comme:

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

Ou pour éviter que vous ayez à coder les réponses pour chaque format dans chaque action.

Si vous n'avez pas mises en page pour l'une des actions de ce contrôleur, il serait plus agréable de le faire:

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

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

Dans les rails 3 use layout: false - nil chargera la disposition par défaut. Voir: http://stackoverflow.com/a/11355276/398696 – d3vkit

28

En supposant que vous avez besoin JSON pour une requête Ajax

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

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

Cela semble être le la solution la plus propre à moi.

8

I love @ solution de anthony, mais ne fonctionne pas pour moi ... je devais faire:

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

ps: l'affichage d'une "réponse" au lieu d'un commentaire parce que la mise en forme stackoverflow commentaire et " return key == submit "est exaspérant!

1

Vous devez définir ceci sur votre action de show.

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

:)

4

Je viens de découvrir ceci:

Même si elle est JSON, Rails est toujours à la recherche d'une mise en page. En tant que tel, la seule disposition qu'il trouve, dans notre cas, est application.html.

Solution: Créez une disposition JSON. Par exemple, si vous mettez un application.json.erb vide avec un seul = yield à l'intérieur, à côté de votre HTML, la mise en page HTML est améliorée par celle de JSON. Vous pouvez même l'utiliser pour entourer votre JSON avec des métadonnées ou des choses comme ça.

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

<%= yield %> 

Aucun autre paramètre nécessaire, cela fonctionne automatiquement!

dans Rails 4 Testés seulement

+0

Testé dans Rails 3, fonctionne très bien. Bien que ce ne soit pas une réponse à la question posée, c'est toujours la réponse à la question que beaucoup d'entre nous veulent dire. – lifecoder

+0

Fonctionne pour moi dans Rails 4. Simple et direct. – emptywalls

+2

Je viens d'enregistrer dans Rails 4.2. Si vous nommez votre fichier de présentation 'application.html.slim', il ne sera pas traité comme fichier de présentation pour json; quiconque, si vous nommez votre fichier de mise en page comme 'application.slim' ..alors il * serait * traité comme un fichier de mise en page pour JSON. (remplacer slim avec erb devrait faire la même chose). – songyy

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