Rails: answer_to JSON и HTML
У меня есть контроллер "UserController", который должен отвечать на обычные и ajax-запросы http://localhost:3000/user/3
,
Когда это нормальный запрос, я хочу сделать мой взгляд. Когда это AJAX-запрос, я хочу вернуть JSON.
Правильный подход, кажется, respond_to do |format|
блок. Написание JSON легко, но как мне заставить его реагировать на HTML и просто отображать представление как обычно?
def show
@user = User.find(params[:id])
respond_to do |format|
format.html {
render :show ????this seems unnecessary. Can it be eliminated???
}
format.json {
render json: @user
}
end
end
3 ответа
Насколько мне известно, нет необходимости "отображать шоу" в format.html, он будет автоматически искать соответствующий вид действия для ex: show.html.erb для запроса html и show,js,erb для запроса JS.
так что это будет работать
respond_to do |format|
format.html # show.html.erb
format.json { render json: @user }
end
Кроме того, вы можете проверить, является ли запрос ajax или нет, проверив request.xhr? он возвращает true, если запрос является ajax.
Да, вы можете изменить его на
respond_to do |format|
format.html
format.json { render json: @user }
end
Лучший способ сделать это, как сказал Амиткумар Джа, но если вам нужен простой и быстрый способ визуализации ваших объектов, вы также можете использовать этот "ярлык":
def index
@users = User.all
respond_to :html, :json, :xml
end
Или сделать respond_to
работать для всех действий в контроллере с использованием response_with:
class UserController < ApplicationController
respond_to :html, :json, :xml
def index
@users = User.all
respond_with(@users)
end
end
Начиная с версии Rails 4.2 вам нужно будет использовать gem responder
чтобы иметь возможность использовать response_with.
Если вам нужно больше контроля и вы хотите иметь несколько действий, которые действуют по-другому, всегда используйте полный блок response_to. Вы можете прочитать больше здесь.