2016-09-22 2 views
7

Я использую Rails 5 API с дизайном. У меня есть модель User. Схема выглядит так.Rails 5 объектов модели, не показывающих всех атрибутов разработчика

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 

Но вопрос я имею Rails показывает только :id , :email , :created_at , :updated_at атрибуты как часть модели. Например, в rails console

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"> 

Но эти атрибуты существуют в базе данных. Эта проблема упоминается ранее. Devise with rails 5. Но ответов нет. Пожалуйста, помогите.

+0

'User.first.to_json' –

ответ

8

Разрабатывает ограничивающий атрибуты как encrypted_password так, что критическая информация не получает отображаются в вызовах API. Поэтому, чтобы переопределить это, вам необходимо переопределить метод serializable_hash.

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

Это не особая функция Rails 5, а функция Devise для защиты ваших атрибутов.

Надеюсь, что это поможет!

+0

Да. То, что я искал. Это не произошло в предыдущих проектах Rails 4.2, построенных с использованием. Не знаете почему? – narym

+1

Я не уверен, но Devise раньше делал это в Rails 3, но это интересно. Я буду смотреть в него. – RSB

+1

Я только что проверил некоторые из моих предыдущих проектов Rails 4, там показаны все атрибуты. Разработать 3.5.5. – narym

1

Try attributes метод

User.first.attributes 
+0

Это дает все атрибуты. Но почему для User.first появляются только некоторые атрибуты. Например, @ user.to_json не добавляет все атрибуты. Таким образом, испортить json-ответы gem's. – narym

+0

try '@ user.attributes.to_json' –

+0

Эй, Bartek, я могу получить атрибуты таким образом. Но мой вопрос заключается в том, почему 'User.first' не показывает все атрибуты. ? – narym

5

Это, вероятно, потому, что devise не раскрывает свои внутренние атрибуты.

Таким образом, чтобы получить все атрибуты, которые вы можете использовать .attributes (документально here), которая возвращает хэш, на котором вы можете позвонить to_json:

user = User.find(1) 
user.attributes.to_json # => contains all fields like reset_password_token etc. 
Смежные вопросы