gpt4 book ai didi

ruby-on-rails - 当没有 block 调用时 response_to 会做什么?

转载 作者:行者123 更新时间:2023-12-04 21:17:03 25 4
gpt4 key购买 nike

我明白了 respond_to当它被这样调用时工作:

def index
@users = User.all
respond_to do |format|
format.html
format.json { render json: @users }
end
end

但我见过一些通过 respond_to 的应用程序 Controller 方法之外的符号列表,例如:
class UsersController < ApplicationController

respond_to :html, :json

def index
# blah blah bah
end
end

这有什么作用?我一直在我的一个 Controller 中玩弄它,但我不知道它有什么不同。

最佳答案

对于给定的 Controller 操作,#respond_with 根据客户端请求的 MIME 类型生成适当的响应。

如果仅使用资源调用该方法,如本例所示 -

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

def index
@people = Person.all
respond_with @people
end
end

然后响应的 MIME 类型通常是根据请求的 Accept header 和先前调用 Controller 类方法 respond_to 所声明的可用格式集来选择的。或者,可以通过在 Controller 中显式设置 request.format 来选择 mime-type。

如果未识别可接受的格式,应用程序将返回“406 - Not Acceptable ”状态。否则,默认响应是呈现以当前操作和所选格式命名的模板,例如index.html.erb。如果没有可用的模板,则行为取决于所选格式:

对于 html 响应 - 如果请求方法是 get,则会引发异常,但对于其他请求(例如发布响应)取决于资源是否存在任何验证错误(即假设已尝试保存资源,例如通过创建操作)-

如果没有错误,即资源已成功保存,则响应重定向到资源,即其显示操作。

如果存在验证错误,响应会呈现默认操作,即 :new 用于发布请求或 :edit 用于补丁或放置。

因此,像这样的例子 -
respond_to :html, :xml

def create
@user = User.new(params[:user])
flash[:notice] = 'User was successfully created.' if @user.save
respond_with(@user)
end

在没有 create.html.erb 的情况下,等效于 -
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
flash[:notice] = 'User was successfully created.'
format.html { redirect_to(@user) }
format.xml { render xml: @user }
else
format.html { render action: "new" }
format.xml { render xml: @user }
end
end
end

对于 javascript 请求 - 如果找不到模板,则会引发异常。

对于其他请求 - 即 xml、json、csv 等数据格式,如果传递给 response_with 的资源响应 to_,则该方法尝试直接以请求的格式呈现资源,例如对于xml请求,响应相当于调用render xml:resource。

关于ruby-on-rails - 当没有 block 调用时 response_to 会做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20492168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com