Rails&Devise:设计未在rails控制台中显示的特定列

我试图在我的用户模型上使用Devise,但是当我进入rails控制台并尝试User.new我只得到:

 irb(main):002:0> User.new => # 

为什么设计列没有出现?

CreateUsers迁移:

 class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| t.string :first_name t.string :last_name t.string :email t.timestamps null: false end end end 

AddDeviseToUsers迁移:

 class AddDeviseToUsers < ActiveRecord::Migration def self.up change_table :users do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: "" ## Recoverable t.string :reset_password_token t.datetime :reset_password_sent_at ## Rememberable t.datetime :remember_created_at ## Trackable 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 ## Confirmable # t.string :confirmation_token # t.datetime :confirmed_at # t.datetime :confirmation_sent_at # t.string :unconfirmed_email # Only if using reconfirmable ## Lockable # t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts # t.string :unlock_token # Only if unlock strategy is :email or :both # t.datetime :locked_at # Uncomment below if timestamps were not included in your original model. # t.timestamps null: false end add_index :users, :email, unique: true add_index :users, :reset_password_token, unique: true # add_index :users, :confirmation_token, unique: true # add_index :users, :unlock_token, unique: true end def self.down # By default, we don't want to make any assumption about how to roll back a migration when your # model already existed. Please edit below which fields you would like to remove in this migration. raise ActiveRecord::IrreversibleMigration end end 

架构显示列在那里:

  create_table "users", force: :cascade do |t| t.string "first_name" t.string "last_name" t.datetime "created_at", null: false t.datetime "updated_at", null: false 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" end add_index "users", ["email"], name: "index_users_on_email", unique: true add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 

有任何想法吗?

它是Devise的一个安全function,用于限制其属性及其包含的关键信息以暴露给API调用。

但是,您可以覆盖它,您需要覆盖serializable_hash方法。

 # app/models/user.rb class User < ActiveRecord::Base devise :database_authenticatable, :recoverable, :confirmable, :rememberable, :validatable ... protected def serializable_hash(options = nil) super(options).merge(encrypted_password: encrypted_password, reset_password_token: reset_password_token) # you can keep adding attributes here that you wish to expose end end 

您可以查看http://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Authenticatable ,其中将常量声明为黑名单属性

 BLACKLIST_FOR_SERIALIZATION =[:encrypted_password, :reset_password_token, :reset_password_sent_at, :remember_created_at, :sign_in_count, :current_sign_in_at, :last_sign_in_at, :current_sign_in_ip, :last_sign_in_ip, :password_salt, :confirmation_token, :confirmed_at, :confirmation_sent_at, :remember_token, :unconfirmed_email, :failed_attempts, :unlock_token, :locked_at] 

希望这能回答你的问题!

设计优先于检查方法不暴露内部属性。 你可以试试:

 User.new.attributes 

要么

 User.new.encrypted_password 

(或者你想要的任何属性)

你可以在这里查看检查方法

如果您只想在Rails控制台中列出所有属性, User.first.serializable_hash(force_except: true)容易使用User.first.serializable_hash(force_except: true)

见http://www.rubydoc.info/github/plataformatec/devise/Devise%2FModels%2FAuthenticatable:serializable_hash