51

我有一个控制器“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
4

3 回答 3

99

据我所知,没有必要在 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

另外,您可以通过检查 request.xhr 来检查请求是否为 ajax?如果请求是 ajax 则返回 true。

于 2013-11-25T08:53:04.083 回答
22

是的,您可以将其更改为

respond_to do |format|
  format.html
  format.json { render json: @user }
end
于 2013-11-25T08:52:09.313 回答
0

最好的方法就像 Amitkumar Jha 所说的那样,但是如果您需要一种简单快捷的方式来渲染您的对象,您也可以使用这个“快捷方式”:

def index
  @users = User.all
  respond_to :html, :json, :xml
end

或者respond_to使用 respond_with 为控制器中的所有操作工作:

class UserController < ApplicationController
  respond_to :html, :json, :xml

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

从 Rails 4.2 版本开始,您需要gem responder使用 respond_with 才能使用。

如果您需要更多控制并希望能够执行一些不同的操作,请始终使用完整的 respond_to 块。你可以在这里阅读更多。

于 2018-04-11T13:49:45.780 回答