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

标签 ruby database sqlite sinatra 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 并输入:

enter image description here

新用户保留在数据库中。

为什么我无法在运行时创建用户有任何想法吗?

附言控制台中没有记录任何错误。

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

关于ruby - 无法使用 DataMapper 在 SQLite 中创建新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27769220/

相关文章:

ruby-on-rails - 无法访问 http_basic block 内的任何 Grape::API 方法/对象

Ruby 扫描标签,除非被 unescaped\

android - 使用 SQLite 数据库文件更新在更新/升级节点中发布应用程序

Ruby 将值传递给方法?网络驱动程序

ruby - 数字填充作为字符串消息的一部分

java - Spring-data-jpa - .save() 什么时候不返回相同的实体?

mysql - Illuminate\Database\Query\Builder 类的对象无法转换为字符串,无法在单个查询中从两个数据库中获取数据

ruby-on-rails - SQLite3::ConstraintException:约束失败:

database - 如何从数据库中检索堆栈

android - 如何过滤 Room 中的嵌套关​​系?