Как мне указать ": layout => false" в Rails в response_with? - PullRequest
32 голосов
/ 07 октября 2010

У меня есть эта настройка:

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

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

Теперь я пытаюсь сделать так, если params[:format] =~ /(js|json)/, render :layout => false, :text => @users.to_json. Как мне сделать это с respond_with или respond_to итекабельным_ресурсом?

Ответы [ 7 ]

44 голосов
/ 07 октября 2010

Что-то вроде:

def index
  @users = User.all
  respond_with @users do |format|
    format.json { render :layout => false, :text => @users.to_json }
  end
end
28 голосов
/ 17 марта 2011

При условии, что вам нужен JSON для Ajax-запроса

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

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

Мне кажется, это самое чистое решение.

18 голосов
/ 07 октября 2010

Или чтобы вам не приходилось жестко кодировать ответы для каждого формата в каждом действии.

Если у вас нет макетов для каких-либо действий в этом контроллере, было бы лучше сделать:

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

  def index
    @users = User.all
    respond_with(@users)
  end
end
8 голосов
/ 05 апреля 2011

Я люблю решение @ Энтони, но у меня не сработало ... Мне пришлось сделать:

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

ps: публикация «ответа» вместо комментария, потому что форматирование комментария stackoverflow и «return key == submit» приводят в бешенство!

4 голосов
/ 19 июля 2013

Я только что узнал:

Даже если это JSON, Rails все еще ищет макет.Таким образом, в нашем случае единственным макетом, который он находит, является application.html.

. Решение. Создайте макет JSON.

Так, например, если вы поместите пустой application.json.erb с одним = yield внутри, рядом с вашим HTML, макет HTML улучшится с помощью JSON.Вы даже можете использовать это, чтобы окружить ваш JSON метаданными или подобными вещами.

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

<%= yield %>

Никаких других параметров не требуется, он работает автоматически!

Проверено только в Rails 4

3 голосов
/ 12 мая 2014
class UsersController < InheritedResources::Base
  layout -> (controller) { controller.request.xhr? ? false : 'application' }
end
1 голос
/ 31 октября 2012

Вам нужно установить это в вашем шоу-действии.

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

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...