【问题标题】:Datamapper and Postgres lost data and error using SinatraDatamapper 和 Postgres 使用 Sinatra 丢失数据和错误
【发布时间】:2016-04-22 18:14:37
【问题描述】:

我有一个 Sinatra 应用程序,它运行一个简单的网站,用户可以在该网站上确认参加某个活动,还可以向出席者提出请求。

我正在使用 datamapper 保存到 Postgres。模型如下所示:

require 'data_mapper'
require 'dm-postgres-adapter'

class Guest
    include DataMapper::Resource

    property :id,     Serial
    property :name,  String
    property :attending,    String
    property :others, String
    property :requests, String

我遇到的问题是,如果我的用户在“请求”部分使用了超过 50 个字符,那么在提交时,该条目中的所有数据(表单中的所有字段)都会完全消失并且永远不会被保存。

我看了https://moodle2013-14.ua.es/moodle/pluginfile.php/73782/mod_resource/content/2/datamapper.org%20docs/docs/properties.html

http://datamapper.org/docs/pitfalls.html

这让我得出结论,datamapper 在使用 String 类型时默认为 50 个字符。所以我尝试了他们提供的解决方案,即修改请求:

property :requests, String, :length => 255

但这样做后,我只会收到以下 sinatra 错误....

DataObjects::DataError 在/invitees

错误:类型字符变化的值太长(50)

app.rb 看起来像这样:

post '/invitees' do
 Guest.create(name: params[:name], attending: params[:attending],  others: params[:others], requests: params[:requests])
 end

谁能帮忙???

【问题讨论】:

  • 我猜你可以访问底层的 Postgres 数据库。您是否可以使用 postgres 控制台检查架构是否已正确设置?

标签: ruby postgresql sinatra datamapper


【解决方案1】:

听起来您还没有将更改应用到基础数据库/表。

如果您不关心删除现有数据,您可以运行DataMapper.auto_migrate!(它将重新创建所有内容)或更具针对性的Guest.auto_migrate!(只会重新创建底层guests 表)。

如果您需要保留现有的表数据,您可能需要执行更复杂的更新。您可能希望通过psql 这样做:

UPDATE pg_attribute SET atttypmod = 255+4
WHERE attrelid = 'guests'::regclass
AND attname = 'requests';

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多