无法使用 DataMapper 在 SQLite 中创建新实体

Can't create new entity in SQLite with DataMapper

我是 Ruby 世界和 Sinatra 的新手,我正在尝试使用 SQLite3 和 Datamapper 作为 ORM 创建一个数据库。我已经安装了此操作所需的 gem。这是我制作数据库和模型的方法:

DataMapper.setup(:default, "sqlite3://#{Dir.pwd}/development.db")

class User
  include DataMapper::Resource

  property :id, Serial
  property :email, String, :required => true
  property :first_name, String
  property :last_name, String
  property :password_hash, String
  property :password_salt, String
end

DataMapper.finalize

我有一个 HTML 注册表单:

<form action="/signup" method="POST" accept-charset="utf-8">
    <input type="text" name="first_name" placeholder="First Name">
    <input type="text" name="last_name" placeholder="Last Name">
    <input type="mail" name="email" placeholder="Email">
    <input type="password" name="password" placeholder="Password">
    <button type="submit">Register me !</button>
</form>

这是我处理注册操作的方式:

post "/signup" do

  password_salt = BCrypt::Engine.generate_salt
  password_hash = BCrypt::Engine.hash_secret(params[:password], password_salt)

  User.create(email: params[:email], first_name: params[:first_name], last_name: params[:last_name], password_hash: password_hash, password_salt: password_salt)

  redirect to '/home'

end

当我执行此命令并在之后登录时 User.all 它不会记录我注册的用户。

但是如果我 运行 irb 并输入:

新用户留在数据库中。

为什么我无法创建用户 运行time?

P.S。控制台中没有记录任何错误。

P.S 2. 我发现 password_salt 和 password_hash 变量是问题所在。两者都是字符串,当我将它们传递给 create 函数时它不起作用,但是如果我将例如 'test' 传递给该函数它工作正常。当我记录这 2 个变量时,它们看起来也很好。

似乎来自 property :password_hash, Stringproperty :password_salt, String 我得到的字符串比来自 DataMapper 的 property 方法的字符串的默认长度更长。

解决方法如下:

property :password_hash, String, :length => 255