在 Rails API 中使用 render 而不是 respond_with/to 有什么区别?
What's the difference between using render instead of respond_with/to in a Rails API?
我正在构建一个关于如何为一些学生构建 API 的简单 rails 教程,我构建它时没有 respond_to 和 respond_with 因为我只是想看看我是否可以在不使用 gem 的情况下构建 api。这就是我所拥有的并且我的测试通过了:
控制器:
class Api::V1::SuyasController < ApplicationController
def index
render json: Suya.all
end
def create
render json: Suya.create(suyas_params)
end
private
def suyas_params
params.require(:suya).permit(:meat, :spicy)
end
end
路线:
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
resources :vendors
resources :suyas
end
end
end
测试:
require 'test_helper'
class Api::V1::SuyasControllerTest < ActionController::TestCase
test "index can get all the suyas" do
Suya.create(meat: "beef", spicy: true)
Suya.create(meat: "kidney", spicy: false)
get :index
suyas = JSON.parse(response.body)
assert_equal "beef", suyas[0]["meat"]
assert_equal true, suyas[0]["spicy"]
assert_equal "kidney", suyas[1]["meat"]
assert_equal false, suyas[1]["spicy"]
end
test "create can create a suya" do
assert_difference("Suya.count", 1) do
create_params = { suya: { meat: "beefy", spicy: true }, format: :json }
post :create, create_params
suya = JSON.parse(response.body)
assert_equal "beefy", suya["meat"]
assert_equal true, suya["spicy"]
end
end
end
使用 render 与 respond_with 有什么区别?我找不到任何答案。我什至做错了什么吗?为什么有两种创建 API 的方法(respond_to/respond_with 和这种方法?)
-杰夫
我想答案是 render
只允许我回复 JSON,而如果我使用 respond_to
和 respond_with
,我可以回复超过只有一种方式?就这些了吗?
有两件事 :)..render
和 respond_to
.
Render 用于创建完整响应并将其发送回浏览器。
所以 render
被用在 respond_to 中,让你的动作对每次调用都非常敏感,无论它是否可以是 js/ajax 调用,整页加载(html),json(显示自动搜索下拉列表,令牌)或 xml.So 如果我希望我的方法起作用并且 respond
来自客户端的每个调用,我将在我的操作中使用下面的块。
respond_to do |format|
format.html { redirect_to(person_list_url) }
format.js {render "show_person_details"}
format.xml { render :xml => @people.to_xml }
format.json { render json: @people}
end
上面的控制器将在每个场景下工作,例如 js/html/json 和 xml 而不会得到 403 Forbidden error
我们通常在对只有 [= 的动作进行 js 调用时得到16=] 而不是 format.js
希望对您有所帮助
render
是 Rails 的一部分,它只是以您所说的任何格式呈现您所说的任何内容。通常是一个视图,可能是一个字符串,可能是一个文件。
一个非常低级的函数,根据约定呈现您所说的任何内容,例如在哪里寻找视图。
respond_to
是一种微型 DSL,它允许您对请求的不同格式做出不同的响应。
我。 e.在 |format|
调用 format.json
的块中需要一个块,该块将根据 JSON 的请求执行,否则将是 no-op(无操作)。此外,如果 respond_to
没有执行任何块,它会响应一个通用的 406 不可接受(服务器无法以客户端可接受的任何格式响应)。
虽然可以做到 if request.json?
,但可读性不强,需要明确指定何时响应 406。
respond_with
,以前是 Rails 的一部分,现在(从 4.2 开始)在 a separate gem responders
(for a reason), 获取一个对象并使用它来构造响应(做出很多假设,所有这些都可以在控制器声明中给出)。
它使典型用例(即某些 API)中的代码更短。在不太典型的用例中,它可以根据您的需要进行定制。在非常不寻常的用例中,它没有用。
我可能过于简化了事情,这是一个总体概述。
我正在构建一个关于如何为一些学生构建 API 的简单 rails 教程,我构建它时没有 respond_to 和 respond_with 因为我只是想看看我是否可以在不使用 gem 的情况下构建 api。这就是我所拥有的并且我的测试通过了:
控制器:
class Api::V1::SuyasController < ApplicationController
def index
render json: Suya.all
end
def create
render json: Suya.create(suyas_params)
end
private
def suyas_params
params.require(:suya).permit(:meat, :spicy)
end
end
路线:
Rails.application.routes.draw do
namespace :api do
namespace :v1 do
resources :vendors
resources :suyas
end
end
end
测试:
require 'test_helper'
class Api::V1::SuyasControllerTest < ActionController::TestCase
test "index can get all the suyas" do
Suya.create(meat: "beef", spicy: true)
Suya.create(meat: "kidney", spicy: false)
get :index
suyas = JSON.parse(response.body)
assert_equal "beef", suyas[0]["meat"]
assert_equal true, suyas[0]["spicy"]
assert_equal "kidney", suyas[1]["meat"]
assert_equal false, suyas[1]["spicy"]
end
test "create can create a suya" do
assert_difference("Suya.count", 1) do
create_params = { suya: { meat: "beefy", spicy: true }, format: :json }
post :create, create_params
suya = JSON.parse(response.body)
assert_equal "beefy", suya["meat"]
assert_equal true, suya["spicy"]
end
end
end
使用 render 与 respond_with 有什么区别?我找不到任何答案。我什至做错了什么吗?为什么有两种创建 API 的方法(respond_to/respond_with 和这种方法?)
-杰夫
我想答案是 render
只允许我回复 JSON,而如果我使用 respond_to
和 respond_with
,我可以回复超过只有一种方式?就这些了吗?
有两件事 :)..render
和 respond_to
.
Render 用于创建完整响应并将其发送回浏览器。
所以 render
被用在 respond_to 中,让你的动作对每次调用都非常敏感,无论它是否可以是 js/ajax 调用,整页加载(html),json(显示自动搜索下拉列表,令牌)或 xml.So 如果我希望我的方法起作用并且 respond
来自客户端的每个调用,我将在我的操作中使用下面的块。
respond_to do |format|
format.html { redirect_to(person_list_url) }
format.js {render "show_person_details"}
format.xml { render :xml => @people.to_xml }
format.json { render json: @people}
end
上面的控制器将在每个场景下工作,例如 js/html/json 和 xml 而不会得到 403 Forbidden error
我们通常在对只有 [= 的动作进行 js 调用时得到16=] 而不是 format.js
希望对您有所帮助
render
是 Rails 的一部分,它只是以您所说的任何格式呈现您所说的任何内容。通常是一个视图,可能是一个字符串,可能是一个文件。一个非常低级的函数,根据约定呈现您所说的任何内容,例如在哪里寻找视图。
respond_to
是一种微型 DSL,它允许您对请求的不同格式做出不同的响应。我。 e.在
|format|
调用format.json
的块中需要一个块,该块将根据 JSON 的请求执行,否则将是 no-op(无操作)。此外,如果respond_to
没有执行任何块,它会响应一个通用的 406 不可接受(服务器无法以客户端可接受的任何格式响应)。虽然可以做到
if request.json?
,但可读性不强,需要明确指定何时响应 406。respond_with
,以前是 Rails 的一部分,现在(从 4.2 开始)在 a separate gemresponders
(for a reason), 获取一个对象并使用它来构造响应(做出很多假设,所有这些都可以在控制器声明中给出)。它使典型用例(即某些 API)中的代码更短。在不太典型的用例中,它可以根据您的需要进行定制。在非常不寻常的用例中,它没有用。
我可能过于简化了事情,这是一个总体概述。