2010-12-15 6 views
12

एक्शनकंट्रोलर की नई respond_with विधि का उपयोग करना ... यह निर्धारित करता है कि कार्रवाई (सहेजने) सफल होने पर और कब नहीं किया जाता है?रेल को समझना 3 का जवाब_with

मैं पूछता हूं क्योंकि मैं पास करने के लिए एक मचान उत्पन्न नमूना (नीचे शामिल) प्राप्त करने की कोशिश कर रहा हूं, अगर केवल इतना है कि मैं इसे समझ सकता हूं। ऐप ठीक काम कर रहा है लेकिन, विचित्र रूप से, यह /carriers प्रतिपादन प्रतीत होता है (कम से कम यही ब्राउज़र का यूआरएल कहता है) जब सत्यापन विफल हो जाता है। फिर भी, यह अनुमान "new" (और मैं भी इस मामले के लिए) की उम्मीद कर रहा हूं लेकिन इसके बजाय <""> प्राप्त कर रहा है। यदि मैं "" की अपेक्षा करने के लिए spec को बदलता हूं तो यह अभी भी विफल रहता है।

जब यह /carriers प्रस्तुत करता है तो वह पृष्ठ उन फ़ील्ड के बगल में error_messages दिखाता है जो सत्यापन की विफलता के रूप में विफल होते हैं।

क्या कोई भी respond_with से परिचित हो सकता है कि यहां क्या हो रहा है?

#carrier.rb 
    validates :name, :presence => true 

#carriers_controller.rb 
class CarriersController < ApplicationController 
    respond_to :html, :json 

... 

    def new 
    respond_with(@carrier = Carrier.new) 
    end 

    def create 
    @carrier = Carrier.new(params[:carrier]) 
    flash[:success] = 'Carrier was successfully created.' if @carrier.save 
    respond_with(@carrier) 
    end 

युक्ति में नाकाम रहने की जाती है कि:

1) CarriersController POST create with invalid params re-renders the 'new' template 
    Failure/Error: response.should render_template("new") 
    expecting <"new"> but rendering with <"">. 
    Expected block to return true value. 
    # (eval):2:in `assert_block' 
    # ./spec/controllers/carriers_controller_spec.rb:81:in `block (4 levels) in <top (required)>' 
+1

आप 'वाहक 'में' वाहक 'नया' और अपने वाहक नियंत्रक के '# निर्माण' कार्यों दोनों का आह्वान कर रहे हैं। मुझे लगता है कि यह 'def create 'कार्रवाई विधि में' वाहक .create (पैराम [: वाहक]) होना चाहिए। – Ernesto

उत्तर

23

tl: डॉ

नकली करने के लिए एक त्रुटि हैश जोड़ें:

#carriers_controller_spec.rb 
require 'spec_helper' 

describe CarriersController do 

    def mock_carrier(stubs={}) 
    (@mock_carrier ||= mock_model(Carrier).as_null_object).tap do |carrier| 
     carrier.stub(stubs) unless stubs.empty? 
    end 
    end 


    describe "POST create" do 
    describe "with invalid params" do 
     it "re-renders the 'new' template" do 
     Carrier.stub(:new) { mock_carrier(:save => false) } 
     post :create, :carrier => {} 
     response.should render_template("new") 
     end 
    end 
    end 
end 
इस त्रुटि के साथ

यह respond_with में वांछित व्यवहार को ट्रिगर करेगा।

यहाँ क्या हो रहा है

post :create

response.code.should == "200" 

यह expected: "200", got: "302" के साथ विफल करने के बाद इस जोड़े। इसलिए जब यह नहीं होना चाहिए तो नए टेम्पलेट को प्रस्तुत करने के बजाय यह रीडायरेक्ट कर रहा है। ये कहां जा रहा है?

response.should redirect_to("/") 

अब यह Expected response to be a redirect to <http://test.host/> but was a redirect to <http://test.host/carriers/1001>

के साथ विफल कल्पना new टेम्पलेट है, जो घटनाओं के सामान्य कोर्स नकली पर save के बाद है प्रतिपादन द्वारा पारित करने के लिए माना जाता है: यह एक पथ हम जानते हैं कि असफल हो जायेगी दें वाहक वस्तु झूठी वापसी करता है। इसके बजाय respond_withshow_carrier_path पर रीडायरेक्ट कर रहा है। जो सिर्फ सादा गलत है। पर क्यों?

स्रोत कोड में कुछ खोदने के बाद, ऐसा लगता है कि नियंत्रक 'वाहक/निर्माण' प्रस्तुत करने का प्रयास करता है। ऐसा कोई टेम्पलेट नहीं है, इसलिए अपवाद उठाया गया है। बचाव ब्लॉक निर्धारित करता है कि अनुरोध एक पोस्ट है और त्रुटि हैश में कुछ भी नहीं है, जिस पर नियंत्रक डिफ़ॉल्ट संसाधन पर रीडायरेक्ट करता है, जो नकली Carrier है।

यह परेशान है, क्योंकि नियंत्रक को यह नहीं मानना ​​चाहिए कि एक वैध मॉडल उदाहरण है। यह सब के बाद create है। इस बिंदु पर मैं केवल अनुमान लगा सकता हूं कि परीक्षण वातावरण शॉर्टकट ले रहा है।

तो कामकाज एक नकली त्रुटि हैश प्रदान करना है। आमतौर पर save विफल होने के बाद हैश में कुछ होगा, ताकि थोड़े समझ में आ सकें।

+0

अच्छी तरह से किया गया! क्या आप इसे एक बग मानेंगे? मुझे रेल के बारे में अभी तक कोई राय नहीं है। लेकिन आपका जवाब मुझे सीखने में मदद कर रहा है! एक बार फिर धन्यवाद... – Meltemi

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