2017-05-22 3 views
0

Push-Daten. Ich versuche, einen Parameter in die Datenbank zu schieben, wenn ich ein Objekt erstelle. Ich habe es funktioniert, wenn ich den Integer wie mit dem kommentierten Code unten erzwinge, aber aus irgendeinem Grund kann ich nicht bekommen, dass es in der Datenbank hinzugefügt wird, ich benutze die Methode params [: subscription_id]. Ich kann die Parameter in meinem Server sehen, sehe aber nicht, dass sie in die Zertifikattabelle eingefügt werden. Wenn ich den Integer in meinem Controller erzwinge, wird es durchlaufen und ich kann sehen, dass die subscriptions_id übergeben wird.Problem mit Param nicht Daten in die Datenbank in Rails

Hat dies irgendeinen Grund zu tun, mit meiner Beziehung eine has_one Beziehung vielleicht?

Certificate Controller 

    class CertificatesController < ApplicationController 
    def new 
     @certificate = Certificate.new 
    end 

    def create 
     @certificate = Certificate.new(certificate_params) 
     @certificate.subscription_id = params[:subscription_id] 
     #@certificate.subscription_id = 1 


     if @certificate.save 
      flash[:success] = "The certificate has been uploaded" 
      redirect_to :back 
     else 
      render 'new' 
     end 
    end 

    private 

    def certificate_params 
    params.require(:certificate).permit(:document, :title, :subscription_id) 
    end 

end 

anzeigen Code:

<%= link_to "upload certificate", new_certificate_path(subscription_id: subscription.id) %> 

Modelle

class Subscription < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :course 
    has_one :certificate 
end 


class Certificate < ActiveRecord::Base 
    belongs_to :subscription 

    has_attached_file :document 
    #validates_attachment :document, content_type: %w(application/pdf application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document) 
    do_not_validate_attachment_file_type :document 
end 

Zertifikat Formular

<div class="row"> 
     <div class="site-forms"> 
       <div class="col-md-10"> 
       <%= simple_form_for @certificate do |f| %> 
         <!-- <= f.input :course_img, as: :file, required: true, label: "Please upload a brand image for your course" %><br> --> 
         <span class="btn btn-default btn-file"> 
          <i class="fa fa-cloud-upload fa-lg"></i> Upload Image 
          <%= f.input :document, as: :file, required: true, label: false %> 
         </span> Please upload Certificate as PDF <br><br> 
        <%= f.input :title, placeholder: "Course Title", required: true, label: "Course Title" %> 
        <%= f.button :submit, class: "btn btn-primary" %> 
        <% end %> 
       </div> 
     </div> 
    </div> 

Dies ist wahrscheinlich etwas dumm ich bin fehlt, aber ich kann es die Arbeit auf wenn ich die Ganzzahl in der Code in der Steuerung auskommentiert. Ich bin mir fast sicher, dass der Params-Code korrekt ist. Vielen Dank.

Hinzugefügt logs

Started POST "/certificates" for ::1 at 2017-05-23 20:40:30 +0100 
Processing by CertificatesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"6fV0xLOoy6ppNG7PYp37vkKqJnxU17nLPSK/mvbgH8k3s2LyaMEOJlekq5S0Ed4fpbNcqVe+cBsu5F38ACCmcg==", "certificate"=>{"document"=>#<ActionDispatch::Http::UploadedFile:0x007f954362c160 @tempfile=#<Tempfile:/var/folders/gx/86yj74bx3md88cfn2fwc975h0000gn/T/RackMultipart20170523-5261-1n2mwfl.png>, @original_filename="duck.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"certificate[document]\"; filename=\"duck.png\"\r\nContent-Type: image/png\r\n">, "title"=>"Test"}, "commit"=>"Create Certificate"} 
Command :: PATH=/usr/local/bin/:$PATH; file -b --mime '/var/folders/gx/86yj74bx3md88cfn2fwc975h0000gn/T/36846677e3a8f4c0b16d8bdf8ef1860820170523-5261-e90bny.png' 
    (0.1ms) begin transaction 
Command :: PATH=/usr/local/bin/:$PATH; file -b --mime '/var/folders/gx/86yj74bx3md88cfn2fwc975h0000gn/T/36846677e3a8f4c0b16d8bdf8ef1860820170523-5261-1d907er.png' 
    SQL (0.3ms) INSERT INTO "certificates" ("document_file_name", "document_content_type", "document_file_size", "document_updated_at", "title", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?) [["document_file_name", "duck.png"], ["document_content_type", "image/png"], ["document_file_size", 49114], ["document_updated_at", "2017-05-23 19:40:30.662715"], ["title", "Test"], ["created_at", "2017-05-23 19:40:30.683041"], ["updated_at", "2017-05-23 19:40:30.683041"]] 
    (0.7ms) commit transaction 
Redirected to http://localhost:3000/certificates/new?subscription_id=3 
Completed 302 Found in 36ms (ActiveRecord: 1.1ms) 


Started GET "/certificates/new?subscription_id=3" for ::1 at 2017-05-23 20:40:30 +0100 
Processing by CertificatesController#new as HTML 
    Parameters: {"subscription_id"=>"3"} 
    Rendered certificates/_form.html.erb (7.7ms) 
    Rendered certificates/new.html.erb within layouts/application (8.7ms) 
    Rendered shared/_message.html.erb (0.1ms) 
Completed 200 OK in 95ms (Views: 94.3ms | ActiveRecord: 0.0ms) 
+0

Haben Sie keine Zeit, um es in diesem Moment zu tauchen, wird später mehr sehen. Aber mein Bauch geht in dieser Situation sofort zu "akzeptiert geschachtelte Attribute für". Auf diese Weise kann der Zertifikatscontroller das durch '@ certificatesubscription_id' repräsentierte Attribut setzen. Ist das entsprechende Abonnement bereits vorhanden? Oder benötigt es den '.build' Befehl? – Beartech

+0

Bitte geben Sie auch Ihre Webserver-Konsolenausgabe an, wenn Sie versuchen, zu speichern. Auf diese Weise können wir die tatsächlichen 'params []' sehen, die an den Controller übergeben werden. Es ist wahrscheinlich, dass Ihr Wert "nil" ist, also ist das, was übergeben wird, es sei denn, Sie nennen in Ihrem Controller explizit "= 1". – Beartech

+0

http://guides.rubyonrails.org/form_helpers.html#building-complex-forms – Beartech

Antwort

1

Sie müssen Ihre subscription_id in einem versteckten Feld, so dass es in der Params-Hash übergeben wird.

<%= f.hidden_field :subscription_id, :value => params[:subscription_id] %> 

So wird es mit dem Rest der Parameter eingestellt.

+0

Danke nochmal Beartech, war so einfach wie das. Ich schaute über das Formular, indem ich versuchte, den Parameter im Controller hinzuzufügen. – Bradley

1

Params sind Strings. Versuchen

@certificate.subscription_id = params[:subscription_id].to_i 
+0

Hmm hat nicht mal verstanden, dass Params eine Saite sind. Ok also füge die Methode to_i hinzu und füttere sie in einer subscription_id. Einziger Fehler ist jetzt, dass die Subskriptions-ID als 0 einspeist. Ich habe den Server angeschaut und er zeigt den korrekten Parameter, wenn die GET-Methode ihn aus dem Parameter holt, aber wenn er in die Tabelle eingefügt wird, zeigt er 0 an. – Bradley

+0

params [: subscription_id] = "1"? – margo

+0

Nein, ich meine, wenn ich at.certificate_subscription_id = 1 in meinem Controller erzwinge, kann ich die subscription_id in die db einspeisen. Wenn ich at.certificate.subscription_id = params [: subscription_id] Es wird beim Einfügen in die Datenbank nicht erkannt. Also ich weiß, dass der Code funktioniert, bis ich die Parameter von der URL ziehe. http: // localhost: 3000/certificates/new? subscription_id = 3 – Bradley

0

Try Änderung dieser Funktion, wie unten

def certificate_params 
    params.require(:certificate).permit(:document, :title, :subscription_id, :subscription) 
    end 

Vielleicht erlauben Abonnement Feld von params ermöglichen.

+0

Genehmigung des Abonnements funktioniert nicht. Keine Ahnung, warum die Parameterwerte nicht eingezogen werden. Dies ist das Protokoll. – Bradley

+0

Scheint so, als hättest du deinen subscription_id pass in create action verpasst. Verwenden Sie das versteckte Feld. –