我是 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 并输入:
新用户保留在数据库中。
为什么我无法在运行时创建用户有任何想法吗?
附言控制台中没有记录任何错误。
P.S 2. 我发现问题出在 password_salt 和 password_hash 变量上。两者都是字符串,当我将它们传递给 create 函数时它不起作用,但是如果我将例如“test”传递给函数它就可以正常工作。当我记录这 2 个变量时,它们看起来也很好。
最佳答案
似乎来自 property :password_hash, String
和 property :password_salt, String
我得到的字符串比 的字符串的默认长度长来自 DataMapper 的 property
方法。
解决方法如下:
property :password_hash, String, :length => 255
关于ruby - 无法使用 DataMapper 在 SQLite 中创建新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769220/