[英]How to make active record initialize with params in Rails 4?
我正在使用Ruby on Rails 4,並且具有以下用戶模型:
require 'uuid'
UUID.state_file = false
UUID.generator.next_sequence
class User < ActiveRecord::Base
attr_accessor :email, :password
has_many :entries
after_initialize do |user|
user.entry_hash = UUID.new.generate
end
end
這基於以下數據庫遷移:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string "email"
t.string "password"
t.string "entry_hash"
t.timestamps
end
end
end
我想自動生成一個uuid作為與該User關聯的哈希。
使用rails控制台創建新用戶,我執行以下操作:
1)我使用創建一個帶有電子郵件和密碼的用戶:
irb(main):001:0> u = User.create(:email=>'abc@gmail.com', :password=>'myPass')
(0.1ms) BEGIN
SQL (0.6ms) INSERT INTO `users` (`created_at`, `entry_hash`, `updated_at`) VALUES ('2013-12-07 22:32:28', '60744ec0-41bd-0131-fde8-3c07542e5dcb', '2013-12-07 22:32:28')
(3.7ms) COMMIT
=> #<User id: 2, email: nil, password: nil, entry_hash: "60744ec0-41bd-0131-fde8-3c07542e5dcb", created_at: "2013-12-07 22:32:28", updated_at: "2013-12-07 22:32:28">
2)但這很奇怪。 如果您看一下SQL,它只會插入entry_hash,並且輸出對象將email和password顯示為nil。 但是,當我嘗試訪問這些屬性時,我得到了放置的屬性。
irb(main):002:0> u.email
=> "abc@gmail.com"
irb(main):003:0> u.id
=> 2
irb(main):004:0> u.password
=> "myPass"
irb(main):005:0> u.entry_hash
=> "60744ec0-41bd-0131-fde8-3c07542e5dcb"
我是Ruby on Rails的新手,我知道背景中發生了一些神奇的事情,但是有人可以啟發我這里發生了什么嗎? 我只想創建一個帶有參數的對象。
干杯
更新:我通過刪除attr_accessor行解決了我遇到的問題。 有人知道為什么它能起作用嗎?
attr_accessor
可以用於您不想直接存儲在數據庫中的值,這些值僅在對象的生存期內存在(例如密碼)。
當您的數據庫中沒有列但仍想在表單中顯示字段時使用。 該字段是Rails模型中的“虛擬屬性”。
create
方法在數據庫中創建行,並返回ruby對象。 這就是為什么通過變量訪問域u
工作,它是活的,而控制台是開放的。 但是,沒有任何東西進入數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.