2017-05-31 1 views
0

Ich habe ein Zitat-Modell in meiner Rails-App, die verschiedene Attr-Typen hat, von denen einige von der DB gesendet/gespeichert werden, einige nicht und ich kann nicht verstehen, warum. Bitte kannst du mir helfen zu verstehen, danke.Warum einige Modellattribute nicht in der Datenbank gespeichert?

quotes_controller.rb

class QuotesController < ApplicationController 

    def create 
    @quote = Quote.new(quote_params) 
    if @quote.save 
     redirect_to root_url, notice: 'Quote request created' 
    else 
     render :new 
    end 
    end 

private 

    def quote_params 
    params.require(:quote).permit(:gla, :prev_cover, :co_name, :postcode, :industry, :lives_overseas, 
            :scheme_start_date, :payment_frequency, :commision_level) 
    end 
end 

quote.rb Modell

class Quote < ApplicationRecord 
     validates :gla, presence: { message: "Must be selected" } 

     enum industry:   [ :financial_services, :architect, :business_consultancy ] 
     enum payment_frequency: [ :annually, :monthly ] 
end 

schema.rb 

create_table "quotes", force: :cascade do |t| 
    t.boolean "prev_cover" 
    t.string "co_name" 
    t.integer "co_number" 
    t.string "postcode" 
    t.string "industry" 
    t.boolean "lives_overseas" 
    t.date  "scheme_start_date" 
    t.string "payment_frequency" 
    t.integer "commission_level" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
    t.boolean "gla" 
    end 

Schienen Konsole:

Pry> Quote.last.attributes 
    Quote Load (0.4ms) SELECT "quotes".* FROM "quotes" ORDER BY "quotes"."id" DESC LIMIT $1 [["LIMIT", 1]] 
=> {"id"=>6, 
"prev_cover"=>true, 
"co_name"=>"test1", 
"co_number"=>nil, 
"postcode"=>"al1 1aa", 
"industry"=>nil, 
"lives_overseas"=>true, 
"scheme_start_date"=>Wed, 31 May 2017, 
"payment_frequency"=>nil, 
"commission_level"=>nil, 
"created_at"=>Wed, 31 May 2017 19:23:07 UTC +00:00, 
"updated_at"=>Wed, 31 May 2017 19:23:07 UTC +00:00, 
"gla"=>true} 

Stack Trace:

Started POST "/quotes" for 127.0.0.1 at 2017-05-31 21:04:37 +0100 
Processing by QuotesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"ILAo0Bs9Wq9lrVPlM2e6+a1kioV9zbni9Uxd5Yt/QSLNY3aVWyJ4TsEUmXN62RWgbueHksr/yN6avwEm8v7bEQ==", "quote"=>{"gla"=>"1", "prev_cover"=>"true", "co_name"=>"testing1", "co_number"=>"123456", "postcode"=>"al1 1aa", "industry"=>"", "lives_overseas"=>"true", "scheme_start_date(1i)"=>"2017", "scheme_start_date(2i)"=>"5", "scheme_start_date(3i)"=>"31", "payment_frequency"=>"", "commission_level"=>"10"}, "commit"=>"Get quote"} 
Unpermitted parameters: co_number, commission_level 
    (0.1ms) BEGIN 
    SQL (0.2ms) INSERT INTO "quotes" ("prev_cover", "co_name", "postcode", "lives_overseas", "scheme_start_date", "created_at", "updated_at", "gla") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id" [["prev_cover", "t"], ["co_name", "testing1"], ["postcode", "al1 1aa"], ["lives_overseas", "t"], ["scheme_start_date", "2017-05-31"], ["created_at", "2017-05-31 20:04:37.489368"], ["updated_at", "2017-05-31 20:04:37.489368"], ["gla", "t"]] 
    (0.3ms) COMMIT 
Redirected to http://localhost:3000/ 
Completed 302 Found in 3ms (ActiveRecord: 0.6ms) 


Started GET "/" for 127.0.0.1 at 2017-05-31 21:04:37 +0100 
Processing by QuotesController#new as HTML 
    Rendering quotes/new.html.erb within layouts/application 
    Rendered quotes/new.html.erb within layouts/application (9.3ms) 
Completed 200 OK in 34ms (Views: 32.7ms | ActiveRecord: 0.0ms) 

Von der Schienenkonsole.

Ok Stack-Trace und @toddmetheny helfen mir, die fehlenden oder typo't zulässigen attrs zu sortieren. Jetzt nur noch die enums Quote.industries und Quote.payment_frequencies, deren Werte nicht gespeichert werden.

Ok, also Code geändert zu;

Und dies sendet die attrs aus der Form, aber sie immer noch in der db, Stack-Trace werden nicht erstellt:

Started POST "/quotes" for 127.0.0.1 at 2017-05-31 21:39:58 +0100 
Processing by QuotesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"rkgX7CwrEHS/KnqG1C77mYkCiCEOWGshTxMCsbtGPdjGiDP20J4ccrAgplAGuKrdJyhECRWrsmXI0Ee9GNa6Zw==", "quote"=>{"gla"=>"1", "prev_cover"=>"true", "co_name"=>"halejulia", "co_number"=>"134532", "postcode"=>"al1 1aa", "industry"=>"financial_services", "lives_overseas"=>"true", "scheme_start_date(1i)"=>"2017", "scheme_start_date(2i)"=>"5", "scheme_start_date(3i)"=>"31", "payment_frequency"=>"monthly", "commission_level"=>"10"}, "commit"=>"Get quote"} 
    (0.1ms) BEGIN 
    SQL (0.3ms) INSERT INTO "quotes" ("prev_cover", "co_name", "co_number", "postcode", "industry", "lives_overseas", "scheme_start_date", "payment_frequency", "commission_level", "created_at", "updated_at", "gla") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING "id" [["prev_cover", "t"], ["co_name", "halejulia"], ["co_number", 134532], ["postcode", "al1 1aa"], ["industry", 0], ["lives_overseas", "t"], ["scheme_start_date", "2017-05-31"], ["payment_frequency", 1], ["commission_level", 10], ["created_at", "2017-05-31 20:39:58.957674"], ["updated_at", "2017-05-31 20:39:58.957674"], ["gla", "t"]] 
    (0.3ms) COMMIT 
Redirected to http://localhost:3000/ 
Completed 302 Found in 3ms (ActiveRecord: 0.7ms) 

Schienen Konsole:

Quote.last.payment_frequency 
    Quote Load (0.4ms) SELECT "quotes".* FROM "quotes" ORDER BY "quotes"."id" DESC LIMIT $1 [["LIMIT", 1]] 
=> nil 

So noch die params aren Da sie nicht in der DB gespeichert sind, sind sie erlaubt Params! irgendwelche Ideen?

Seltsam, eine psql select * from .. Abfrage zeigt, dass die Werte gespeichert wurden, aber Rails-Konsole; Quote.last.payment_frequency gibt null zurück ???

Aha, ich sehe, dass für eine Enumeration der Spaltentyp Integer sein sollte, aber es ist String in meinem Modell, könnte dies das Problem vielleicht sein?

Der Datentyp von enum'd attrs wurde in Integer geändert und alle verhalten sich wie erwartet.

+0

aktualisierte Antwort unter – toddmetheny

Antwort

1

Veröffentlichen Sie die Stack-Trace. co_number wird nicht in den erlaubten Parametern auf die weiße Liste gesetzt. Das ist zumindest ein Teil des Problems in diesem speziellen Bereich. Die anderen sind ... aber posten Sie, was Sie tatsächlich in den Protokollen sehen, damit wir sehen können, was das Formular passiert. Es gibt auch Nachrichten in der Stapelüberwachung, die Hinweise darauf geben, warum diese Werte nicht gespeichert werden.

Update: die Stack-Trace-Listen 2 unpermitted Parameter: co_number und commission_level (Sie haben einen Tippfehler Kommissionsebene ermöglicht und co_number gibt es nicht)

Ein paar Dinge haben leere Werte, auch ... wie payment_frequency und industry ... Ich würde herausfinden, warum diese Dinge leer sind, wenn sie nicht sein sollten. Hat die Form Werte für diese Dinge? Sie werden nicht weitergegeben. Das scheint den Rest Ihrer Nullwerte zu erklären.

+1

Es gab drei Probleme hier 1) ein Tippfehler und ein fehlender erlaubter param, 2) Code, den ich schrieb, um zu schreiben und.humanize Der enum-Hash reproduziert den ursprünglichen enum-Schlüssel nicht, der dem enum-Wert zugeordnet werden soll. 3) Die aufgelisteten attr-Datentypen in der db waren string und mussten ganzzahlig sein. – jbk

Verwandte Themen