我有一个包含用户名的文本文件。我想从文本文件中提取用户名,并通过db migrations将其插入到表中。这里提取部分工作正常。使用rake db没有显示错误:迁移。 但数据库中没有数据。
class AddUsers< ActiveRecord::Migration
def self.up
i=0
File.open("users").each do |line|
if i>=4 && line=~/^(\s)+[a-z]+/
word=line.split("|")
word[0]=word[0].strip
email=word[0]+"\@sandvine.com"
puts "word=#{word[0]},email=#{email}"
User.create :name =>#{word[0]}, :email => #{email}
puts "created"
end
i=i+1
end
end
u=User.create(:name => "ramyameena", :email => "ramyameena@sandvine.com",:password=>"sandvine",:roles=>{:id=>2,:name=>"Tester"})
=> #<**User id: nil**, name: "ramyameena", created_at: nil, updated_at: nil, email: "ramyameena@sandvine.com", encrypted_password: "$2a$10$qIfRLKZlxviag9E0Gzvp8e3VKkOCaXraP7PnJC6vGMN....", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil>
irb(main):012:0> u.errors.inspect
=> "#<OrderedHash **{:roles=>[\"can't be blank\"]**}>"
我的用户型号:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
validates :name, :presence => true, :uniqueness => true
validates :roles, :presence => true
has_many :user_role_assignments
has_many :roles, :through => :user_role_assignments
has_many :tester_release_assignments
has_many :releases, :through => :tester_release_assignments
has_many :releases
has_many :ic_runs
accepts_nested_attributes_for :user_role_assignments
attr_accessible :email, :name, :password, :password_confirmation, :role_ids
感谢, 拉姆亚。
答案 0 :(得分:1)
我不确定你要调用的create方法。之后的所有内容=&gt;将是一个评论。 应该是
User.create :name => word[0], :email => email
此外,最好将此代码添加到db/seeds.rb
,而不是迁移,因为这是种子数据。
您可以使用rake db:seed
答案 1 :(得分:1)
#{...}
语法用于在字符串中插入ruby。你在这里正确使用它:
puts "word=#{word[0]},email=#{email}"
但在这里不正确:
User.create :name =>#{word[0]}, :email => #{email}
这里#
实际上正在评论该行的其余部分(您甚至可以通过此处的语法突出显示)。很遗憾在运行此代码时不会出现任何语法错误,但最好结果是未定义的。你想要的是这个:
User.create(:name => word[0], :email => email)
正如@dexter alread所说。
顺便说一句,这是使用大括号的一个原因,即使你不必这样做,因为:User.create(:name =>#{word[0]}, :email => #{email})
肯定会抛出语法错误,因为右括号被注释掉了。