Ответ 1
Что-то вроде:
def index
@users = User.all
respond_with @users do |format|
format.json { render :layout => false, :text => @users.to_json }
end
end
У меня есть эта настройка:
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?
Что-то вроде:
def index
@users = User.all
respond_with @users do |format|
format.json { render :layout => false, :text => @users.to_json }
end
end
Предполагая, что вам нужен 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
Это кажется самым чистым решением для меня.
Или для предотвращения необходимости жесткого кодирования ответов для каждого формата в каждом действии.
Если у вас нет макетов для каких-либо действий в этом контроллере, было бы лучше сделать:
class UsersController < InheritedResources::Base
respond_to :html, :js, :xml, :json
layout false
def index
@users = User.all
respond_with(@users)
end
end
Я люблю решение @anthony, но не работаю для меня... Я должен был сделать:
respond_with(@users) do |format|
format.html { render :layout => !request.xhr? }
end
ps: публикация "ответа" вместо комментария, потому что форматирование комментария stackoverflow и "return key == submit" является бесит!
Я только что нашел это:
Даже если это JSON, Rails все еще ищет макет. Таким образом, единственный в своем распоряжении макет, в нашем случае, application.html
.
Решение. Сделайте раскладку JSON.
Так, например, если вы помещаете пустой application.json.erb
с одним = yield
внутри, рядом с вашим HTML-кодом, макет HTML лучше подходит JSON. Вы можете даже использовать это, чтобы окружить JSON метаданными или такими вещами.
<%# app/views/layouts/application.json.erb %>
<%= yield %>
Никаких других параметров не требуется, он автоматически работает!
Проверено только в Rails 4
class UsersController < InheritedResources::Base
layout -> (controller) { controller.request.xhr? ? false : 'application' }
end
Вам нужно установить это в своем действии.
def show
render :layout => !request.xhr?
end
:)