Rails没有将用户数据输入到postgresql

时间:2011-04-26 22:25:22

标签: ruby-on-rails postgresql rspec

我遇到的问题是Rails没有向postgresql输入值。数据库本身已连接。当我运行db:create:all(来自database.yml的片段)

development:
  adapter: postgresql
  encoding: unicode
  database: website_development
  username: postgres
  password: *******
  host: 127.0.0.1
  port: 9435

(测试:与数据库相同:website_test而不是website_development)所有数据库都是为测试和开发而创建的。当我运行我的db:migration时,还创建了用户表,例如迁移文件“date”_create_user.rb

中的代码段
class CreateUsers < ActiveRecord::Migration
  def self.up

    create_table :users do |t|
      t.string :username
      t.string :email

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

(我已经检查了pgAdmin并找到了创建的表格)但是当我尝试从控制台插入数据时(例如,这是在沙箱中运行)

irb(main):001:0> User.create!(:username => "John", :email => "john@example.com)
=> #<User id: 1, username: nil, email: nil, created_at: "2011-04-26 22:00:28", u
pdated_at: "2011-04-26 22:00:28">

这里是在不同的创建上生成的sql!我跑了

[1m[35mSQL (2.0ms)[0m  INSERT INTO "users" ("username", "email", "created_at", "updated_at") VALUES (NULL, NULL, '2011-04-26 20:53:43.363908', '2011-04-26 20:53:43.363908') RETURNING "id"

有关为什么rails正在创建数据库和表格但没有找到正确的用户名和电子邮件以输入sql的任何帮助。

P.S。我正在为我的测试运行Rspec,并且已经对用户名和电子邮件的值进行了多次测试,并且这些测试都没有成功。

......................
Finished in 1.62 seconds
22 examples, 0 failures
Notification failed: 201 - The destination server was not reachable
Notification failed: 201 - The destination server was not reachable

正如您所看到的,所有Rspec测试都是绿色的但是连接到postgres服务器时遇到问题

提前感谢您的任何建议。

更新:添加了用户模型代码段

class User < ActiveRecord::Base

    attr_accessor :username, :email

    email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    username_regex = /\A[\w\d]+\z/i

    validates :username, :presence   => true,
                         :format     => { :with => username_regex },
                         :length     => { :maximum => 30},
                         :uniqueness => { :case_sensitive => false }
    validates :email,    :presence   => true,
                         :format     => { :with => email_regex },
                         :uniqueness => { :case_sensitive => false }
end

==回答==

这些是我的错误:

第1部分:通过将attr_accessor更改为attr_accessible我的所有测试都正常运行,以及需要变为红色的所有内容,这也允许我添加:email详细信息,但不是{{ 1}}详细信息导致第2部分。

第2部分:由于某些原因,rails不喜欢我的表名为:username且我的列名为:user的事实。所以我尝试将用户名改为:username,这完全解决了问题。

感谢大家的帮助。

1 个答案:

答案 0 :(得分:1)

要隔离它,您可能需要构建一个单元测试来复制问题,然后根据需要进行修复。起初我怀疑这是一个受保护属性的情况,但看起来你已经让它们可以访问,这是正确的事情。

直接调用create!有点危险,因为您不能轻易捕获在异常情况下半创建的对象。这是因为虽然异常包含对模型的引用,但是不清楚User模型或其他模型是否在没有额外挖掘的情况下首先导致异常。

更可靠的方法是:

def test_create_example
  user = User.new(:username => "John", :email => "john@example.com")

  assert_equal 'John', user.username
  assert_equal 'john@example.com', email

  user.save

  assert_equal [ ], user.errors.full_messages
  assert_equal false, user.new_record?
end

如果验证流中发生错误,您将看到列出的错误应该是一个空数组。它还通过测试它已不再是新记录来检查记录是否已保存,因为记录有效但如果before_savebefore_create过滤器返回false则无法保存这种情况偶然发生。

如果您致电new然后save,您可以在保存之前以及之后检查新准备的对象。