我遇到的问题是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
,这完全解决了问题。
感谢大家的帮助。
答案 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_save
或before_create
过滤器返回false
则无法保存这种情况偶然发生。
如果您致电new
然后save
,您可以在保存之前以及之后检查新准备的对象。