2012-08-16 14 views
9

Ho un modello di prescrizione nella mia applicazione Rails 3. Sto cercando di individuare il metodo migliore per consentire la duplicazione dei record, ma di consentire all'utente di "rivedere" il duplicato prima che venga salvato.Duplicazione di un record in Rails 3

Ho letto un numero di domande/risposte su SO (come ad esempio this) che spiegano come duplicare/clonare il record e quindi salvarlo, ma nessuno che spiega come mostrare il modulo prima del salvataggio.

Leggere l'API Rails è visualizzato il metodo clone è disponibile.

lettura other questions e risposte dimostra che è può essere fatto, ma non v'è alcun codice di esempio a parte:

new_record = old_record.dup 

Il codice di controllo Attualmente sto lavorando con è la seguente (il modello non ha relazioni):

# 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 

ho intenzione di essere il collegamento a questa azione clone dalla vista con:

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

È semplice come aggiungere un'azione al mio controller in questo modo?

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

Mi scuso se il codice di cui sopra è completamente sbagliato, sto cercando di ottenere la mia testa intorno ad esso! Ho visto someone fare esattamente quello che sto cercando di ottenere con la clonazione, ma non con la modifica prima del salvataggio.

L'utente che sta eseguendo la duplicazione non avrà l'autorizzazione per modificare un record una volta salvato. È puramente per l'immissione dei dati iniziale.

risposta

7

Se si desidera che l'azione clone consenta all'utente di rivedere il duplicato prima che venga salvato (creato da AKA), è quasi come l'azione "nuova", ad eccezione dei campi già inseriti.

Così il vostro metodo clone potrebbe essere una modifica del vostro nuovo metodo:

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 

Dal punto di vista, si può quindi creare l'oggetto.

5

Per fare ciò, dovrai creare una nuova istanza della tua classe di prescrizione. "dup" funziona, ma si presume che sovrascriva il record esistente. Solo i metodi che terminano con il botto (!) Tendono a farlo.

Il codice dovrebbe essere:

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

o

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

Questo non è il test per i tempi in cui il: id non viene trovato.

+0

Penso che questa sia la risposta giusta, dal momento che Rails imposta l'id a zero quando si utilizza 'dup' su un modello, trattando è nuovo. Vedi http://apidock.com/rails/ActiveRecord/Core/dup –

0

Stavo cercando la logica per clonare un record esistente. Ho dovuto modificare leggermente la logica postata da ronalchn perché quando ha tentato di eseguire la seconda istruzione di clone ho ricevuto un errore di assegnazione di massa perché ha tentato di copiare id, created_at, updated_at che non sono inclusi nella mia lista attr_accessible.Ecco come ho modificato la logica per farlo funzionare nella mia applicazione usando il mio modello:

@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 
Problemi correlati