2013-03-14 2 views
10

Wie bekomme ich Werte, um ein neues device Formular vorzufüllen, wenn Sie von rfid teilweise von view/cabinet/show Seite navigieren? device has_one rfid.Rails/Ruby - Formular vorbefüllen mit Daten von einer anderen Seite

Die Verbindung von Schrank/show:

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

Die devices_controller, mag ich die create-Methode Arbeit haben, wenn entweder 0 oder 2 params übergeben werden:

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 

Ende

Der cabinet_id- und der rfid-Teil von 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> 

Vielen Dank.

+0

Versuchen Sie nur, das RFID-Feld vorzufüllen? – zeantsoi

+0

Nein, ich nehme nur einen Schritt nach dem anderen. Hoffentlich, wenn ich rfid finde, werde ich das Kabinett alleine bekommen. –

+0

Ich habe mit Code geantwortet, der beide Felder vorbelegen sollte. Kannst du mir sagen, ob es funktioniert? – zeantsoi

Antwort

10

Wenn Sie:

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

können Sie die rfid und cabinet_id Felder erhalten vorab ausgefüllt mit:

<%= 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] %> 

Beachten Sie, dass Ihre params Schlüssel muss den Wert in die Hash in Ihrem link_to Tag übergeben entsprechen .

+0

Super! Ich musste ein bisschen herumtüfteln, aber du hast mich definitiv auf den richtigen Weg gebracht. –

+2

Mit der Ausnahme, dass '_form.rb' auch von der' edit'-Aktion verwendet wird und diese Werte nun bearbeitet werden. – aidan

+0

@aidan, du machst wohl Witze; Wenn Ihre '_form.rb'-Werte betroffen sind, haben Sie sie falsch zugeordnet. Außerdem wäre es hilfreich, einen Kontext für das Problem zu haben, das Sie gerade erleben, insbesondere, wenn Sie einer Antwort folgen, die drei Jahre alt ist. Welche Version Rails verwenden Sie überhaupt? Die Version wurde mehrmals gestoßen, seit diese Frage beantwortet wurde. – zeantsoi

4

@ zeantsois Antwort wie gepostet funktioniert meist, aber es bricht die Bearbeitungsfunktionen. Als fix, schlage ich vor, die folgende kleine Änderung: wird

<%= 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 %> 

diese Weise, wenn params[:cabinet_id] fehlt, @device.cabinet_id (der bestehende Wert) bestehen bleiben.

Verwandte Themen