微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我试图在我的用户模型上使用Devise但是当我进入rails控制台并尝试User.new时我只得到:
irb(main):002:0> User.new
=> #<User id: nil,first_name: nil,last_name: nil,email: nil,created_at: nil,updated_at: nil>

为什么设计专栏没有出现?

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,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,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,: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",null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",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的一个安全功能,用于限制其属性及其包含的关键信息以暴露给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_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,:confirmed_at,:confirmation_sent_at,:remember_token,:unconfirmed_email,:Failed_attempts,:locked_at]

希望这能回答你的问题!

原文地址:https://www.jb51.cc/ruby/265599.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐