Подтвердить что ты не робот

Как указать ": layout => false" в Rails "response_with"?

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

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 и inherited_resources?

4b9b3361

Ответ 1

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

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

Ответ 2

Предполагая, что вам нужен 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

Это кажется самым чистым решением для меня.

Ответ 3

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

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

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

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

Ответ 4

Я люблю решение @anthony, но не работаю для меня... Я должен был сделать:

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

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

Ответ 5

Я только что нашел это:

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

Решение. Сделайте раскладку JSON.

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

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

<%= yield %>

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

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

Ответ 6

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

Ответ 7

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

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

:)