如何在Rails 4中使用params初始化活动记录?

时间:2013-12-07 22:49:33

标签: ruby-on-rails ruby activerecord ruby-on-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作为与该用户关联的哈希值。

使用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之外的任何内容,输出对象将显示电子邮件和密码为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行修复了我遇到的问题。任何人都知道为什么会让它发挥作用?

1 个答案:

答案 0 :(得分:3)

attr_accessor

  • 可用于您不希望直接存储在数据库中的值,并且仅在对象的生命周期内存在(例如密码)。

  • 在数据库中没有列但仍希望在表单中显示字段时使用。该字段是Rails模型中的“虚拟属性”。

方法create在数据库中创建行,并返回ruby对象。这就是为什么通过变量u访问字段的工作原理,它在控制台打开时仍处于活动状态。但是,没有任何东西进入数据库。