使用rake db:使用sinatra和activerecord迁移(不是rails)

时间:2015-09-08 08:04:55

标签: ruby-on-rails ruby activerecord sqlite sinatra

我正在使用耙与sinatra和activerecord(而不是rails)。我有两个模型类 - Admin(在admin.rb中)和Bill(bill.rb)。我能够使用以下输出运行rake db:create_migrations(但我看不到数据库中的任何表 - sqlite)。知道我可能做错了吗?

== 20150907135939 CreateAdmins: migrating ======================================
-- create_table(:admins)
   -> 0.0011s
== 20150907135939 CreateAdmins: migrated (0.0012s) =============================

== 20150907140840 CreateBills: migrating ======================================
-- create_table(:bills)
   -> 0.0005s
== 20150907140840 CreateBills: migrated (0.0006s) =============================

Rake文件

# Rakefile

require './app'
require 'sinatra'
require 'active_record'
require 'sinatra/activerecord/rake'

的Gemfile

# Gemfile

source 'https://rubygems.org'


gem "sinatra"
gem "activerecord"
gem "sinatra-activerecord"
gem 'sinatra-flash'
gem 'sinatra-redirect-with-flash'
gem 'rake'
gem 'sqlite3'

=begin
group :development do
 gem 'sqlite3'
 gem "tux"
end

group :production do
 gem 'sqlite3'
end
=end

当我在test.rb文件中运行以下查询时,我得到一个异常:

puts("type email address of admin")
admin_email = gets.chomp
find_admin = Admin.find_by(email:admin_email) # read
puts("admin retrieved with email: #{find_admin.email} and name: #{find_admin.name}")

例外:

test.rb:41:in `<main>': undefined method `email' for nil:NilClass (NoMethodError)

我回来的对象是nil(我使用find_admin.nil检查了吗?)

1 个答案:

答案 0 :(得分:2)

首先,在您输入输入电子邮件后尝试strip前导和尾随空格,如下所示:

admin_email = gets.chomp.strip
puts "admin_email: #{admin_email.inspect}"

然后,再次尝试您的脚本。它应该工作。

要解释此处发生了什么,请查询:

find_admin = Admin.find_by(email:admin_email)

这无法通过提供的电子邮件找到管理记录。因此,它是nil对象,当您致电:find_admin.email,即nil.email时,您会收到错误消息:

undefined method `email' for nil:NilClass (NoMethodError)

您需要确保拥有给定电子邮件的管理员。要做到这一点,您可以先在rails控制台中创建一个,然后执行以下操作:

Admin.create!(email: 'testadmin@test.com')

然后,尝试通过提供testadmin@test.com作为输入来找到上述管理员。

如果数据库中存在具有给定电子邮件的管理员记录,则它应该有效。