【问题标题】:Rails: respond_to JSON and HTMLRails:respond_to JSON 和 HTML
【发布时间】:2013-12-09 21:10:48
【问题描述】:

我有一个控制器“UserController”,它应该响应对http://localhost:3000/user/3 的正常和 ajax 请求。

当它是一个正常的请求时,我想渲染我的视图。当是 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

【问题讨论】:

  • 当您在没有任何内容的情况下调用您的操作网址时,例如/users/3 它将返回 html。如果你调用 /users/3.json - 它会返回 json

标签: ruby-on-rails ruby ruby-on-rails-4 respond-to


【解决方案1】:

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

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

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

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 块。你可以阅读更多here

【讨论】:

  • 快捷方式符号对我不起作用。我需要一些额外的配置吗?
  • @wensveen 请留下更多信息,以防有人或我能回答。
  • 我对 Ruby 和 Rails 还很陌生。当我使用“快捷方式”时,Rails 给出了关于缺少模板的错误。我有一个 html 模板,但预计 json 会自动处理。当我使用 respond_with 或使用带有 render json: 的 respond_to 块时,它确实有效
【解决方案2】:

是的,你可以改成

respond_to do |format|
  format.html
  format.json { render json: @user }
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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 2015-04-26
      相关资源
      最近更新 更多