ruby-on-rails - Rails 控制台正在添加 nil 而不是值

标签 ruby-on-rails ruby postgresql

目前,当尝试通过 Rails 控制台或种子数据将新用户添加到我的用户表时,一切都是零。

在我运行的种子文件中:

u1 = User.create(:from_email => "v@gmail.com", :to_email => "s@gmail.com", :from_name=>"Vero", :to_name=>"Spencer", :message=>"Test message", :password=>"chicken", :id => 1)
u1.save!

如果我通过 rails 中的种子数据或通过 rails 控制台运行它,然后使用 User.all 检查 Postgres 数据库,我得到:

#<User id: 1, from_name: nil, to_name: nil, from_email: nil, to_email: nil, message: nil, created_at: "2014-12-10 02:34:02", updated_at: "2014-12-10 02:34:02", password: nil>

我已经处理这个问题好几个小时了,开始变得很困惑。帮助将不胜感激,我的模型和架​​构如下:

class User < ActiveRecord::Base
attr_accessor :from_name, :from_email, :to_name, :to_email, :message, :password, :id

before_save { self.from_email = from_email.downcase }
before_save { self.to_email = to_email.downcase }
before_save { self.password = "merrychristmas#{ Random.rand(1000) }" }

validates :id, :presence => true, :uniqueness => true
validates :from_name, :presence => true, :uniqueness => false
validates :to_name, presence: true, :uniqueness => false
validates :from_email, presence: true, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i}
validates :to_email, presence: true, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
validates :message, presence: true, length: { maximum: 50 }

def self.authenticate(id, password)
    user = find(id)
if user && user.password
        user
else
        nil
end
end

结束

架构:

ActiveRecord::Schema.define(version: 20141209104326) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "users", force: true do |t|
    t.string   "from_name"
    t.string   "to_name"
    t.string   "from_email"
    t.string   "to_email"
    t.text     "message"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "password"
  end

end

SQL

(0.3ms)  BEGIN
  User Exists (0.5ms)  SELECT  1 AS one FROM "users"  WHERE "users"."id" = 2 LIMIT 1
  SQL (0.4ms)  INSERT INTO "users" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", "2014-12-10 04:15:33.579478"], ["updated_at", "2014-12-10 04:15:33.579478"]]
   (6.5ms)  COMMIT
=> #<User id: nil, from_name: nil, to_name: nil, from_email: nil, to_email: nil, message: nil, created_at: "2014-12-10 04:15:33", updated_at: "2014-12-10 04:15:33", password: nil>

最佳答案

您的问题是在您的模型中使用 attr_accessor。这应该只用于你想为你不想存储在数据库中的对象定义 getter/setter 方法的地方。 See here获取更多信息。

删除以 attr_accessor 开头的整个行,您的代码将起作用。

同时删除 id 的分配和验证其存在的行。这是由数据库自动处理的。

关于ruby-on-rails - Rails 控制台正在添加 nil 而不是值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27392659/

相关文章:

ruby-on-rails - 如何在heroku上托管的ruby on rails项目中实现 Elasticsearch ?

c++ - QT5.7 - 为什么我使用 QString 得到格式错误的 json 值,但使用 std::string 却完美无缺?

ruby - 如何防止 Ruby Windows 上的 SSL 错误

ruby-on-rails - 在 Rails 中更新数据库中的多行,每行都具有唯一值

postgresql - 如果参数为空,则无法查询 SQL 忽略部分 WHERE

ruby-on-rails - Rails 4 使用 Engine 中的 Factory Girl 工厂

javascript - Bootstrap 4 DateTimePicker 不工作。图标不显示

ruby-on-rails - Rails(set_no_cache 方法)无法在 Safari 和 Opera 中禁用浏览器缓存

ruby - 使用 `spreadsheet` gem 按名称访问单元格

sql - 为什么我使用这些 postgresql 时态数据库模式和查询得到重复的行?