2013-03-14 6 views
10

Come ottengo i valori per prepopolare un nuovo modulo device quando ci si sposta da esso alla pagina view/cabinet/show parziale? device has_one rfid.Rails/Ruby - Prepopolare il modulo con i dati passati da un'altra pagina

Il collegamento da cabinet/spettacolo:

<%= link_to "Create New Device (non-functional)", new_device_path({:id => @rfid.id, cabinet_id: @cabinet.id}), :class => "btn btn-primary" %> 

Il devices_controller, voglio avere il lavoro creare metodo quando sono passati 0 o 2 params:

def create(options) 

if options[:cabinet_id] and options[:id] 
    @rfid = Rfid.find(params[:id]) 
    @device = Device.new(params[:device]) 
    @device.rfid = @rfid 
    @device.cabinet_id = :cabinet_id 

else 
    @device = Device.new(params[:device]) 
    @cabinet = Cabinet.find(params[:device][:cabinet_id]) 
    @device.row_id = @cabinet.row_id 
end 
    respond_to do |format| 
    if @device.save and @cabinet.refresh_capacity_used and @cabinet.refresh_consumption 
     format.html { redirect_to @device, notice: 'Device was successfully created.' } 
     format.json { render json: @device, status: :created, location: @device } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @device.errors, status: :unprocessable_entity } 
    end 
    end 

fine

La parte cabinet_id e rfid di new device/_form:

<tr> 
     <th>Cabinet</th> 
     <td><%= f.select :cabinet_id, options_from_collection_for_select(Cabinet.order(:name).all, "id", "name", @device.cabinet_id) %></td> 
</tr> 


<tr> 
     <th>RFID</th> 
     <td><%= f.text_field :rfid, :value => params[:rfid]%></td> 
</tr> 

Grazie.

+0

Stai solo cercando di far precompilare il campo RFID? – zeantsoi

+0

No, basta prenderlo un passo alla volta. Spero che se riuscirò a capire rfid, prenderò l'armadietto da solo. –

+0

Ho risposto con un codice che dovrebbe precompilare entrambi i campi. Puoi dirmi se funziona? – zeantsoi

risposta

10

Se si dispone di:

<%= link_to "Create New Device (non-functional)", new_device_path({:id => @rfid.id, :cabinet_id => @cabinet.id}), :class => "btn btn-primary" %> 

è possibile ottenere precompilare i campi rfid e cabinet_id utilizzando:

<%= f.select :cabinet_id, options_from_collection_for_select(Cabinet.order(:name).all, "id", "name", params[:cabinet_id]) %> 

<%= f.text_field :rfid, :value => params[:id] %> 

Si noti che la chiave params deve corrispondere al valore passato nel hash nel tag link_to .

+0

Fantastico! Ho dovuto smanettare un po 'ma sicuramente mi hai fatto prendere la strada giusta. –

+2

Tranne che '_form.rb' è anche usato dall'azione' edit', e ora la modifica di quei valori è interrotta. – aidan

+0

@aidan, stai scherzando; se i valori di '_form.rb' sono interessati, li hai mappati in modo errato. Inoltre, fornire un contesto intorno al problema che stai vivendo sarebbe utile, in particolare nel seguire una risposta di tre anni. Che versione Rails stai usando? La versione è stata urtata più volte da quando è stata fornita una risposta a questa domanda. – zeantsoi

4

@ la risposta di zeantsoi come postata funziona principalmente, ma interrompe la funzionalità di modifica. Come una correzione, propongo la seguente modifica minore:

<%= f.select :cabinet_id, options_from_collection_for_select(Cabinet.order(:name).all, "id", "name", params[:cabinet_id] || @device.cabinet_id) %> 

<%= f.text_field :rfid, :value => params[:rfid] || @device.rfid %> 

In questo modo, se params[:cabinet_id] è assente, @device.cabinet_id (il valore esistente) persisterà.

Problemi correlati