简体   繁体   中英

How do I specify “:layout => false” in Rails' respond_with?

I have this setup:

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

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

Now I am trying to make it so, if params[:format] =~ /(js|json)/ , render :layout => false, :text => @users.to_json . How do I do that with respond_with or respond_to and inherited_resources?

Something like:

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

Assuming you need JSON for an Ajax request

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

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

This seems like the cleanest solution to me.

Or to prevent you having to hardcode responses for each format in each action.

If you have no layouts for any of the actions in this controller it would be nicer to do:

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

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

I love @anthony's solution, but didn't work for me... I had to do:

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

ps: posting an "answer" instead of a comment because stackoverflow comment formatting and "return key == submit" is infuriating!

I just found this out:

Even if it's JSON, Rails is still looking for a layout. As such, the only layout that it finds, in our case, is application.html .

Solution: Make a JSON layout.

So for instance, if you put an empty application.json.erb with a single = yield inside, next to your HTML one, the HTML layout is bettered by the JSON one. You can even use this to surround your JSON with metadata or things like that.

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

<%= yield %>

No other parameters needed, it automagically works!

Tested in Rails 4 only

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

You need to set this on your show action.

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

:)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM