2016-07-17 7 views
0

Ich mache eine App in Schienen 5 mit Gerät. Aber nach der Migration von Benutzermodell, das durch devise verwendet wird, die Ergebnisse sind folgende:Devise mit Schienen 5

User.new => 
    User id: nil, 
    email: "", 
    created_at: nil, 
    updated_at: nil. 

während Es sollte wie gezeigt werden:

User id: nil, 
email: "", 
encrypted_password: "", 
reset_password_token: nil, 
reset_password_sent_at: nil, 
remember_created_at: nil, 
sign_in_count: 0, 
current_sign_in_at: nil, 
last_sign_in_at: nil, 
current_sign_in_ip: nil, 
last_sign_in_ip: nil, 
created_at: nil, 
updated_at: nil, 
name: nil 

Es bedeutet Felder nicht schaffen werden. Aber wenn ich die mysql-Datenbank sehe, werden alle Felder innerhalb der Benutzertabelle erstellt. Warum zeigt es dann nicht in der Rails-Konsole?

Im Folgenden sind die schema.rb:

ActiveRecord::Schema.define(version: 20160717050914) do 

    create_table "users", force: :cascade do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.string "confirmation_token" 
    t.datetime "confirmed_at" 
    t.datetime "confirmation_sent_at" 
    t.string "unconfirmed_email" 
    t.integer "failed_attempts",  default: 0, null: false 
    t.string "unlock_token" 
    t.datetime "locked_at" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true 
    t.index ["email"], name: "index_users_on_email", unique: true 
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 
    t.index ["unlock_token"], name: "index_users_on_unlock_token", unique: true 
    end 

end 
+0

Hast du 'reload!' Deine Rails-Konsole? –

+0

Ja, ich habe @zaph –

Antwort

2

Dies liegt daran, devise die Methode inspizieren überschreibt, um nicht ihre internen Attribute zu zeigen. Siehe hierzu: https://github.com/plataformatec/devise/blob/29142418bade74224d98bbf5bbcadfba181d5db9/lib/devise/models/authenticatable.rb#L119-L124

Wie auch immer, sie sind da. Nur nicht in der inspect Methode ausgedruckt.

Um alle Attribute sehen Sie verwenden können:

user = User.first 
user.attributes # => returns a hash containing all the attributes 

Oder z.B.

user.current_sign_in_ip # => #<IPAddr: IPv4:xxx.xxx.xxx.xxx/255.255.255.0> 
0

Devise schränkt Attribute wie encrypted_password durch Überschreiben der Standard inspect Methode so, dass die kritischen Informationen nicht in API-Aufrufen ausgesetzt bekommen: die current_sign_in_ip zu bekommen. Also diese außer Kraft zu setzen, müssen Sie die serializable_hash Methode außer Kraft zu setzen:

def serializable_hash(options = nil) 
    super(options).merge({ encrypted_password: encrypted_password }) 
end 

Schauen Sie sich die Diskussion here.