2016-09-22 31 views
7

Używam Rails 5 API z devise. Mam model User. Schemat wygląda tak.Rails 5 obiektów modelu nie pokazujących wszystkich atrybutów Devise

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.inet  "current_sign_in_ip" 
    t.inet  "last_sign_in_ip" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.index ["email"], name: "index_users_on_email", unique: true, using: :btree 
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree 
    end 

Ale problem mam jest Szyny pokazując tylko :id , :email , :created_at , :updated_at atrybuty jako część modelu. Na przykład w konsoli szynowej

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

User.first 
    User Load (0.5ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT $1 [["LIMIT", 1]] 
=> #<User id: 2, email: "[email protected]", created_at: "2016-09-22 03:58:04", updated_at: "2016-09-22 04:54:41"> 

Ale te atrybuty istnieją w bazie danych. Ten problem został wspomniany wcześniej. Devise with rails 5. Ale nie ma tam odpowiedzi. Pomóżcie.

+0

'User.first.to_json' –

Odpowiedz

8

Devise ogranicza atrybuty jak encrypted_password tak, że krytyczne informacje nie dostać ujawnione w wywołaniach API. Aby to zmienić, należy zastąpić metodę serializable_hash.

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

To nie jest Szyny 5 Specyfiką ale funkcja Devise chronić swoje atrybuty.

Nadzieję, że pomaga!

+0

Tak. To, czego szukałem. Nie zdarzyło się to we wcześniejszych projektach Rails 4.2 zbudowanych przy pomocy narzędzia Devise. Nie pewny dlaczego ? – narym

+1

Nie jestem pewien, ale Devise robił to w Rails 3, ale to jest interesujące. Zapoznam się z tym. – RSB

+1

Właśnie sprawdziłem niektóre z moich wcześniejszych projektów Rails 4, wszystkie atrybuty są tam wyświetlane. Wymyśl 3.5.5. – narym

1

Spróbuj attributes metoda

User.first.attributes 
+0

To daje wszystkie atrybuty. Ale dlaczego tylko niektóre atrybuty pojawiają się dla User.first. Na przykład @ user.to_json nie dodaje wszystkich atrybutów. W ten sposób zepsute wymyślają odpowiedzi jsona klejnotów. – narym

+0

spróbuj '@ user.attributes.to_json' –

+0

Hej Bartek, mogę uzyskać atrybuty w ten sposób. Ale moje pytanie brzmi: dlaczego 'User.first' pokazuje wszystkie atrybuty. ? – narym

5

Jest to prawdopodobnie dlatego devise nie wystawiać swoje wewnętrzne atrybuty.

Tak, aby uzyskać wszystkie atrybuty można użyć .attributes (udokumentowane here), która zwraca hash, na który można zadzwonić to_json:

user = User.find(1) 
user.attributes.to_json # => contains all fields like reset_password_token etc.