2013-03-25 52 views
2

我目前正在用Sinatra构建一个小应用程序,并针对保存表单数据到mysql数据库的问题运行。首先,我可以确认与数据库的连接正在工作,因为我使用twitter auth登录到应用程序,并将dat保存到其表中。无法使用datamapper与sinatra保存表单数据

形式是简单

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! 

和西纳特拉路线是这样的:

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闪光灯返回。林肯定这是一个明显的事情,但我不能看到我哪里错了任何地方。

+0

为什么不记录dataMapper在保存失败时返回的错误?具体来说,log @ weight.errors - 它应该列举失败的任何验证。 – mcfinnigan 2013-03-25 10:40:19

+0

我不知道该怎么做,我需要只需要在视图中输出? – 2013-03-25 10:45:13

+0

谢谢,你的问题让我意识到我在表单标记中缺少method =“post”:) – ConorLuddy 2014-03-04 23:30:28

回答

0

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

数据库正在等待一个数字,但是当窗体正在使用一个文本框时,它试图将其另存为一个字符串。所以我加了.to_f到我的金额参数来转换它。

2
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 

尽管如此,理想情况下,您应该设置一个记录器并记录您的操作。这使调试变得更容易。

+0

我该如何去设置一个记录器,你知道任何链接吗? – 2013-03-25 11:35:52

+0

http://stackoverflow.com/questions/5995854/logging-in-sinatra会给你几个提示。 – mcfinnigan 2013-03-25 11:44:54