2012-08-16 20 views
9

मेरे पास मेरे रेल 3 एप्लिकेशन में एक पर्चे मॉडल है। मैं रिकॉर्ड्स को डुप्लिकेट करने की अनुमति देने का सबसे अच्छा तरीका तैयार करने की कोशिश कर रहा हूं, लेकिन उपयोगकर्ता को सहेजने से पहले डुप्लिकेट की "समीक्षा" करने की इजाजत देता है।रेल 3 में एक रिकॉर्ड डुप्लिकेट करना

मैंने SO (जैसे this एक) पर कई प्रश्न/उत्तर पढ़े हैं जो बताते हैं कि रिकॉर्ड को डुप्लिकेट/क्लोन कैसे करें और फिर इसे सेव करें - लेकिन कोई भी जो सहेजने से पहले फ़ॉर्म को दिखाने का तरीका बताता है।

रेल एपीआई पढ़ना clone विधि उपलब्ध है।

पढ़ना other questions और जवाब से पता चलता है है कि किया जा सकता है, लेकिन कोई उदाहरण कोड से अलग है:

new_record = old_record.dup 

नियंत्रक कोड मैं वर्तमान के साथ इस प्रकार है काम कर रहा हूँ (मॉडल किसी भी रिश्ते नहीं है):

# POST /prescriptions 
    # POST /prescriptions.json 
    def create 
    @prescription = Prescription.new(params[:prescription]) 
    @prescription.localip = request.env['REMOTE_ADDR'] 
    @prescription.employee = @prescription.employee.upcase 

    respond_to do |format| 
     if @prescription.save 
     format.html { redirect_to @prescription, notice: 'Prescription was successfully created.' } 
     format.json { render json: @prescription, status: :created, location: @prescription } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @prescription.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

मैं के साथ दृश्य से यह क्लोन कार्रवाई को जोड़ने जा करने के लिए जा रहा हूँ:

<%= link_to "Create another like this?", clone_prescription_url(@prescription), :method => :put %> 

क्या यह मेरे नियंत्रक को इस तरह की कार्रवाई जोड़ने जैसा आसान है?

def clone 
@prescription = Prescription.find(params[:id]) 
@prescription.dup 
@prescription.save 
end 

उपरोक्त कोड पूरी तरह गलत है, तो माफी माँगती है, मैं इसके चारों ओर अपना सिर लेने की कोशिश कर रहा हूं! मैंने someone देखा है जो मैं क्लोनिंग के साथ प्राप्त करने की कोशिश कर रहा हूं - लेकिन सहेजने से पहले संपादन के साथ नहीं।

डुप्लिकेट करने वाले उपयोगकर्ता को सहेजे जाने के बाद रिकॉर्ड संपादित करने की अनुमति नहीं होगी। यह पूरी तरह से आंतरिक डेटा प्रविष्टि के लिए है।

उत्तर

7

यदि आप क्लोन एक्शन को उपयोगकर्ता को सहेजने से पहले डुप्लिकेट की समीक्षा करने की अनुमति देने के लिए अनुमति देते हैं (AKA बनाया गया), तो यह लगभग पहले से ही फ़ील्ड भरने के अलावा "नई" कार्रवाई की तरह है।

def new 
    @prescription = Prescription.new() 
end 
def clone 
    @prescription = Prescription.find(params[:id]) # find original object 
    @prescription = Prescription.new(@prescription.attributes) # initialize duplicate (not saved) 
    render :new # render same view as "new", but with @prescription attributes already filled in 
end 

ध्यान में रखते हुए, वे तो वस्तु बना सकते हैं:

तो अपने क्लोन विधि अपने नए विधि का एक संशोधन हो सकता है।

5

ऐसा करने के लिए, आपको अपने प्रिस्क्रिप्शन क्लास का एक नया उदाहरण बनाना होगा। "डुप्लिक" काम करता है, लेकिन आप मानते हैं कि यह मौजूदा रिकॉर्ड को ओवरराइट करता है। बैंग (!) के साथ समाप्त होने वाली विधियां केवल ऐसा करती हैं।

आपका कोड होना चाहिए:

def clone 
@prescription = Prescription.find(params[:id]) 
@new_prescription = @prescription.dup 
@new_prescription.save 
end 

या

def clone 
@prescription = Prescription.find(params[:id]).dup 
@prescription.save 
end 

इस समय के लिए परीक्षण नहीं किया गया है: आईडी नहीं मिला है।

+0

मुझे लगता है कि यह सही जवाब है, के बाद से रेल जब 'एक मॉडल पर dup' का उपयोग कर शून्य करने के लिए आईडी सेट, इलाज: यह कैसे मैं इसे अपने मॉडल का उपयोग कर अपने आवेदन में काम करने के लिए प्राप्त करने के लिए तर्क संशोधित है यह नया है। Http://apidock.com/rails/ActiveRecord/Core/dup देखें –

0

मैं एक मौजूदा रिकॉर्ड क्लोन करने के लिए तर्क की तलाश में था। मुझे ronalchn द्वारा पोस्ट किए गए तर्क को थोड़ा संशोधित करना पड़ा क्योंकि जब क्लोन के दूसरे कथन को निष्पादित करने का प्रयास किया गया तो मुझे एक बड़े असाइनमेंट त्रुटि मिली क्योंकि उसने आईडी, create_at, update_at को कॉपी करने का प्रयास किया जो मेरी attr_accessible सूची में शामिल नहीं है।

@old_event = Event.find(params[:id]) # find original object 
@event = Event.new 
@event.field_1 = @old_event.field_1 (statement for each field in attar_accessible) 
render :new # render same view as "new", but with @prescription attributes already filled in