2012-03-31 10 views
48

से 204 से बचाता है, मैं रेल के लिए PUT और 204 प्राप्त करने से बचाना चाहता हूं। मैं इस पद्धति का उपयोग कर रहा हूँ:रेल उत्तर में 204 से बचाता है जो PUT

class SomeController < ApplicationController 
    respond_to :json 

    def update 
    # ... 
    respond_with(some_object) 
    end 
end 

हालांकि, जब मैं एक put अद्यतन करने के लिए करते हैं, मैं एक 204 वापस मिलता है। मुझे एहसास है कि यह पूरी तरह मान्य है, लेकिन मैं स्पष्ट रूप से सामग्री को वापस चाहता हूं। मैं इसे कुछ हद तक ओवरराइड कर सकता हूं:

def update 
    respond_with(some_object) do |format| 
    format.json{render json: some_object} 
    end 
end 

लेकिन यह रेल के लिए थोड़ा सा लगता है। क्या 204 से बचने और पूर्ण सामग्री को वापस भेजने का अनुरोध करने का कोई और बेवकूफ तरीका है? यह रेल 3.2 है।

संक्षेप में: मुझे अधिकतम बेवकूफ रेल चाहिए जो 204 से बचाती है।

उत्तर

29

मैंने एक कस्टम उत्तरदाता बनाया जो हमेशा मेरे JSON एन्कोडेड संसाधन को PUT/POST पर भी देता है।

मैंने इस फ़ाइल को lib/responders/json_responder.rb पर रखा है। आपका /lib डीआईआर ऑटोलोडेड होना चाहिए।

module Responders::JsonResponder 
    protected 

    # simply render the resource even on POST instead of redirecting for ajax 
    def api_behavior(error) 
    if post? 
     display resource, :status => :created 
    # render resource instead of 204 no content 
    elsif put? 
     display resource, :status => :ok 
    else 
     super 
    end 
    end 
end 

अब, नियंत्रक को स्पष्ट रूप से संशोधित करें जिसके लिए इस व्यवहार की आवश्यकता है, या इसे एप्लिकेशन नियंत्रक में रखें।

class ApplicationController < ActionController::Base 

    protect_from_forgery 

    responders :json 

end 

अब आपको PUT पर JSON एन्कोडेड संसाधन प्राप्त करना चाहिए।

+8

मैं जोड़ना होगा कि आप 'प्रतिसाददाताओं' मणि की जरूरत है अपने नियंत्रक में प्रतिसाददाताओं विधि का उपयोग करने में सक्षम हो: उसके चारों ओर पाने के लिए, मैं respond_with विधि का उपयोग कर से बचने के लिए किया था। – iterion

3

क्या बस कर रही के साथ गलत क्या है:

def update 
    some_object = SomeObject.update() 
    render json: some_object 
end 
+2

आपको उचित http प्रतिक्रिया कोड या त्रुटियों को वापस नहीं मिलेगा –

+0

उपर्युक्त टिप्पणी की तरह, आपको 'अपडेट' सफल होने पर या नहीं, इस पर कोई प्रतिक्रिया नहीं मिली है। – Leito

11

यह व्यवहार HTTP कल्पना के साथ लाइन में गिर जानबूझकर लगता है, और "आदर्श" आप परिणाम देखने के लिए एक अतिरिक्त GET अनुरोध बंद फायरिंग किया जाना चाहिए। हालांकि, मैं असली दुनिया में सहमत हूं कि मैं इसे JSON वापस कर दूंगा।

@ jpfuentes2 के उपरोक्त समाधान को चाल (यह नीचे खींचने के अनुरोध के समान ही है) करना चाहिए, लेकिन मुझे कुछ भी लागू करने में संकोच नहीं है जो पैचिंग रेल आंतरिक हैं, क्योंकि यह मुख्य संस्करणों के बीच अपग्रेड करने का वास्तविक दर्द हो सकता है, खासकर यदि आपके पास इसके लिए परीक्षण नहीं हैं (और चलो इसका सामना करते हैं, डेवलपर्स अक्सर नियंत्रक परीक्षणों पर कंजूसी करते हैं)।

संदर्भ

+0

आपके उत्तर के लिए धन्यवाद। आप सही हैं, मैं एक फ्रेमवर्क से लड़ने के लिए 'जेएस' से एक और '$ .get' बनाना चाहता हूं। – jibiel

6

बस स्पष्ट करने के लिए, यदि आप ऐसा करने प्रतिसाददाताओं मणि की जरूरत नहीं है ... आप कर सकते हैं बस करो:

config/initializers/responder_with_put_content।rb

class ResponderWithPutContent < ActionController::Responder 
    def api_behavior(*args, &block) 
    if put? 
     display resource, :status => :ok 
    else 
     super 
    end 
    end 
end 

और फिर या तो (के लिए सभी अद्यतन कार्रवाई प्रभावित होने की):

class ApplicationController < ActionController::Base 
    def self.responder 
    ResponderWithPutContent 
    end 
end 

या अपने कार्रवाई में:

def update 
    foo = Foo.find(params[:id]) 
    foo.update_attributes(params[:foo]) 
    respond_with foo, responder: ResponderWithPutContent 
end 
+0

आपने अपना दिन बचाया। (Y) –

9

एक कम आक्रामक विकल्प के रूप में, आप एक पारित कर सकते हैं आपके नियंत्रक update कार्रवाई के अंदर respond_with विधि आमंत्रण का विकल्प, इस तरह:

def update 
    # ... 
    respond_with some_object, json: some_object 
end 

माना जाता है कि यह तर्क में दो बार ऑब्जेक्ट दोहराने के लिए थोड़ा unDRY लगता है, लेकिन यह आपको जो भी चाहिए, वह आपको PUT अनुरोध की प्रतिक्रिया में ऑब्जेक्ट का जेसन प्रतिनिधित्व देगा, और आप नहीं render json: तरीके का उपयोग करने की आवश्यकता है, जो आपको उत्तरदाताओं के लाभ नहीं देगा।

हालांकि, यदि आपके पास इस स्थिति के साथ बहुत से नियंत्रक हैं, तो उत्तरदाताओं को अनुकूलित करना, क्योंकि jpfuentes2 स्वीकार्य anwser में दिखाया गया है, जाने का तरीका है। लेकिन एक त्वरित एकल मामले के लिए, यह विकल्प आसान हो सकता है।

स्रोत: https://github.com/plataformatec/responders/pull/115#issuecomment-72517532

1

नहीं इस व्यवहार के एक बड़े प्रशंसक।

class SomeController < ApplicationController 
    respond_to :json 

    def update 
    # ... 
    respond_to do |format| 
     format.json { render(json: some_object, status: 200) } 
    end 
    end 
end 
संबंधित मुद्दे