2015-07-13 75 views
6

我正在構建一個關於如何爲一些學生構建API的簡單的rails教程,並且我正在構建它而沒有respond_to和respond_with,因爲我只想看看是否可以在不使用gem的情況下構建api。這是我和我的測試都通過了:在Rails API中使用render而不是respond_with/to有什麼區別?

控制器:

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 

什麼是使用渲染VS respond_with之間的區別?我找不到任何答案。有什麼我做錯了嗎?爲什麼有兩種方法來創建的API(respond_to代碼/ respond_with而這樣一來?)

-Jeff

+0

你面臨什麼問題? – Ojash

+0

從你的角度來看代碼有什麼問題?你得到什麼錯誤? – Makoto

+0

基本上,爲什麼有兩種方法可以做到這一點?我的方式和另一種方式有什麼區別?我的測試通過和一切......我只是不知道這兩種方式存在。 – Jwan622

回答

11
  • render是Rails的的一部分,它只是呈現你所說的任何格式。通常一個視圖,可能是一個字符串,可能是一個文件。

    一個非常低級的函數,可以呈現您所說的每個約定的一些假設,比如在哪裏尋找視圖。

  • respond_to是微DSL,讓您所請求的反應不同,以不同的格式。

    I.e。在|format|的塊中調用format.json需要一個將在JSON請求上執行的塊,否則將爲空操作(無操作)。另外,如果respond_to沒有執行任何代碼塊,它將使用通用的406 Not Acceptable(服務器無法響應客戶端可以接受的任何格式)進行響應。

    雖然可以做到if request.json?,它不是那麼可讀,需要明確指定時,在a separate gem responders與406

  • respond_with迴應,以前的Rails的一部分,現在(從4.2)(用於一個reason),需要一個對象,並用它來構建一個響應(做了很多假設,所有這些都可以在控制器聲明中給出)。

    它使得代碼在典型的使用情況下(即一些API)要短得多。在不太典型的用例中,可以根據您的需求進行定製。在非常不尋常的用例中,它是沒有用的。

我可能是過分簡化的東西,這是一個概述。

0

我認爲答案是render只允許我用JSON響應,而如果我使用respond_torespond_with,我能以不止一種方式迴應?這就是全部?

3

有兩樣東西:) .. renderrespond_to

渲染用於創建完整響應並將其發送回瀏覽器。 因此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調用僅具有format.html而不是format.js

行動取得希望它有助於