2013-09-03 3 views
23

संपादित करें मैंने एक मचान उत्पन्न किया है, चलिए इसे मचान परीक्षण कहते हैं। उस मचान के भीतर, मुझे _form.html.erb मिल गया है जो क्रियाओं के लिए प्रस्तुत किया जा रहा है: नया =>: बनाएं और: संपादित करें =>:सबमिट करने के दौरान form_for अंतर जानने के लिए कैसे करें: नया:

रेल कभी-कभी बहुत सारे जादू करता है और मैं यह नहीं समझ सकता कि कैसे form_for जानता है कि कैसे उचित कॉल करने के लिए: नए और: जब बीच प्रस्तुत दबाने कार्रवाई को संपादित

scaffolded फार्म

<%= form_for(@test) do |f| %> 


    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

बनाम संयुक्त राष्ट्र के scaffolded फार्म

<% form_for @test :url => {:action => "new"}, :method => "post" do |f| %> 
     <%= f.submit %> 
<% end %> 

संपादित टेम्पलेट

<h1>Editing test</h1> 

<%= render 'form' %> 

नई टेम्पलेट

<h1>New test</h1> 

<%= render 'form' %> 

आप थेरेस रूपों बीच कोई अंतर नहीं देख सकते हैं कैसे दोनों टेम्पलेट्स एक ही रूप प्रदान कर सकते हैं, लेकिन विभिन्न कार्यों का उपयोग करें?

उत्तर

46

यह @test.persisted? चेक करता है यदि यह जारी है तो यह एक संपादन फ़ॉर्म है। यदि यह नहीं है, तो यह एक नया रूप है।

+1

'action' और' method' वास्तव में 'object.persisted के आधार पर कर रहे हैं' जाँच: https://github.com/rails/rails/blob/4-0-stable/actionpack/lib /action_view/helpers/form_helper.rb?#L441-L453। तो मुझे नहीं पता कि यह जवाब क्यों कम किया गया था। शायद "अगर यह जारी रहता है तो थोड़ा सा रेफ्रिसिंग की आवश्यकता होती है तो यह एक संपादन रूप है। यदि यह नहीं है, तो यह एक नया रूप है" – vee

3

यदि @test आवृत्ति चर Test.new कक्षा विधि के माध्यम से तत्काल है, तो create विधि निष्पादित की जाती है। यदि @test डेटाबेस में मौजूद Test का उदाहरण है, तो update विधि निष्पादित की गई है।

दूसरे शब्दों में:

# app/controllers/tests_controller.rb 
def new 
    @test = Test.new 
end 

<%= form_for(@test) |do| %> एक ब्लॉक create नियंत्रक विधि को भेजी जाने वाली अर्जित करता है।

, तो इसके बजाय:

# app/controllers/tests_controller.rb 
def edit 
    @test = Test.find(params[:id]) 
end 

<%= form_for(@test) |do| %> एक ब्लॉक update नियंत्रक विधि को भेजी जाने वाली अर्जित करता है।

अद्यतन:

सटीक समारोह है कि रेल पहचान करने के लिए किया जाए या नहीं एक रिकार्ड नई है का उपयोग करता है persisted? तरीका है।

+0

तो यह उन लोगों के साथ काम करता है: क्रिया सही है? –

+0

आपका क्या मतलब है? – zeantsoi

+0

अगर यह नया था @test = टेस्ट।नया अंत –

5

यह जांचता है कि रिकॉर्ड नया है या नहीं।

@test.new_record? # if true then create action else update action 
+0

यह सहायक था कि यह चेक form_for सहायक में ट्रिगर किया गया है? –

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