【问题标题】:Cant save form data using datamapper with sinatra无法使用带有 sinatra 的数据映射器保存表单数据
【发布时间】:2013-03-25 10:37:29
【问题描述】:

我目前正在使用 Sinatra 构建一个小型应用程序,并且遇到了将表单数据保存到 mysql 数据库的问题。首先,当我使用 twitter auth 登录应用程序并将 dat 保存到其表中时,我可以确认与数据库的连接正在工作。

形式简单

route: '/'
<form action="/create" method="post">
    <p>
        <label for="">Weight</label>
        <input type="text" name="weight[amount]">
    </p>
    <p>
        <input type="submit" id="">
    </p>
</form>

模型是这样的

class Weight
   include DataMapper::Resource
   property :id,         Serial, key: true
   property :amount,     Float 
   property :is_goal,    Boolean, :default  => false
   property :created_at, DateTime, :required => true
   belongs_to :user
end

DataMapper.finalize
DataMapper.auto_upgrade!

而 sinatra 的路线是这样的:

 post '/create' do
    @weight = Weight.create(params[:weight])
 if @weight.save 
    flash[:success] = "Its all saved now"
    redirect '/'
 else
    flash[:failure] = "I Didnt save!"
    redirect '/'
 end
 end

现在由于某种原因,每次我输入表单时都会返回 I didnt save 闪存。我确定这是一件显而易见的事情,但我看不出我哪里出错了。

【问题讨论】:

  • 为什么不记录保存失败时dataMapper返回的错误?具体来说,记录@weight.errors - 它应该枚举所有失败的验证。
  • 我不知道该怎么做,我只需要在视图中输出吗?
  • 谢谢,您的问题让我意识到我的表单标签上缺少 method="post" :)

标签: mysql ruby database sinatra datamapper


【解决方案1】:
  post '/create' do
  @weight = Weight.create(params[:weight])

  if @weight.save 
    flash[:success] = "Its all saved now"
    redirect '/'
   else
    flash[:failure] = "I Didnt save!"
    STDERR.puts @weight.errors.inspect # <-- will dump the errors structure to STDERR
    redirect '/'
   end
 end

不过,理想情况下,您应该设置一个记录器并记录您在做什么。这使得调试变得更加容易。

【讨论】:

【解决方案2】:

感谢 mcfinnigans 的评论,我通过将错误记录到控制台的帮助解决了这个问题。

数据库需要一个数字,但由于表单正在使用文本框,它试图保存为字符串。所以我将.to_f 添加到我的金额参数中以进行转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多