2015-07-13 8 views
6

मैं कुछ छात्रों के लिए एपीआई बनाने के तरीके पर एक साधारण रेल ट्यूटोरियल का निर्माण कर रहा हूं और मैं इसे answer_to और respond_with के बिना बना रहा हूं क्योंकि मैं सिर्फ यह देखना चाहता हूं कि मैं एक मणि का उपयोग किए बिना एपीआई बना सकता हूं या नहीं।रेल एपीआई में 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 

क्या respond_with बनाम प्रस्तुत करना का उपयोग कर के बीच अंतर है? मुझे कोई जवाब नहीं मिल रहा है। क्या ऐसा कुछ भी है जो मैं गलत कर रहा हूं? क्यों एपीआई बनाने के दो तरीके देखते हैं (respond_to/respond_with और इस तरह से?)

जेफ

+0

आपको किस समस्या का सामना करना पड़ रहा है? – Ojash

+0

आपके परिप्रेक्ष्य से कोड के साथ क्या गलत है? आपको क्या त्रुटियां मिल रही हैं? – Makoto

+0

असल में, ऐसा करने के दो तरीके क्यों हैं? मेरे रास्ते और दूसरे के बीच क्या अंतर है? मेरे परीक्षण पास और सबकुछ ... मैं सिर्फ दोनों तरीकों से नहीं जानता हूं। – Jwan622

उत्तर

11
  • render रेल का हिस्सा है और यह सिर्फ उम्मीद है कि जो भी प्रारूप आप कहते हैं उसमें जो कुछ भी कहता है उसे प्रस्तुत करता है। आम तौर पर एक दृश्य, संभवतः एक स्ट्रिंग, संभवतः एक फ़ाइल।

    एक बहुत कम-स्तरीय फ़ंक्शन जो कुछ भी कहता है जो प्रति सम्मेलनों में कुछ मान्यताओं को कहता है, जैसे कि देखने के लिए कहां देखना है।

  • respond_to एक माइक्रो-डीएसएल है जो आपको विभिन्न प्रारूपों के लिए अलग-अलग प्रतिक्रिया देने की अनुमति देता है।

    I. ई। |format| के साथ एक ब्लॉक में format.json पर कॉल करें जो एक JS की आवश्यकता है जो JSON के अनुरोध पर निष्पादित किया जाएगा, अन्यथा कोई ऑप-ऑप नहीं होगा (कोई ऑपरेशन नहीं)। साथ ही, यदि respond_to किसी भी ब्लॉक को निष्पादित नहीं किया गया है, तो यह सामान्य 406 स्वीकार्य नहीं है (सर्वर क्लाइंट द्वारा स्वीकार्य किसी भी प्रारूप में प्रतिक्रिया नहीं दे सकता है)।

    हालांकि यह if request.json? करना संभव है लेकिन यह बेहद पठनीय नहीं है और (के लिए जब 406.

  • respond_with साथ, पूर्व रेल का हिस्सा है, (4.2 के बाद से) a separate gem responders में प्रतिक्रिया करने के लिए अब स्पष्ट रूप से निर्दिष्ट करने की जरूरत है reason), एक ऑब्जेक्ट लेता है और प्रतिक्रिया बनाने के लिए इसका उपयोग करता है ( की बहुत सारी धारणाएं बनाना, उन सभी को नियंत्रक घोषणा पर दिया जा सकता है)।

    यह सामान्य उपयोग मामलों (i। E। कुछ एपीआई) में कोड बहुत छोटा बनाता है। गैर-विशिष्ट उपयोग मामलों में इसे आपकी आवश्यकताओं के अनुसार अनुकूलित किया जा सकता है। अत्यधिक असामान्य उपयोग मामलों में इसका कोई उपयोग नहीं है।

मैं चीजों को अत्यधिक सरल बना सकता हूं, यह एक सामान्य अवलोकन है।

0

मुझे लगता है कि जवाब है कि render केवल मुझे, JSON के साथ प्रतिक्रिया करने के लिए अगर मैं respond_to और respond_with का उपयोग जबकि की अनुमति देता है, मैं सिर्फ एक ही तरीके से प्रतिक्रिया दे सकता हूं? यही बात है न?

3

दो चीजें हैं :) .. render और respond_to

रेंडर का उपयोग पूर्ण प्रतिक्रिया बनाने के लिए किया जाता है और इसे ब्राउज़र पर वापस भेजता है। तो renderrespond_to में उपयोग किया जाता है, ताकि प्रत्येक कॉल के लिए आपकी कार्रवाई बहुत ही प्रतिक्रियाशील हो सके, चाहे वह जेएस/AJAX कॉल, पूर्ण पृष्ठ लोड (एचटीएमएल), जेसन (ऑटोसर्च ड्रॉपडाउन, टोकन दिखाने के लिए) या xml हो। तो अगर मैं अपना चाहता हूं क्लाइंट से प्रत्येक कॉल के लिए काम करने के लिए विधि और 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 
नियंत्रक ऊपर

403 Forbidden error हो रही है जो हम करने के आम तौर पर करने के एक js कॉल कार्रवाई केवल format.html और नहीं format.js

होने के लिए किया जाता है जब बिना इस तरह के जे एस/html/json और xml के रूप में, हर परिदृश्य पर काम करेंगे आईटी मदद मिलती है

संबंधित मुद्दे

 संबंधित मुद्दे