无法在 Sinatra 中使用默认进程转储哈希



可能重复:
难以访问Sinatra 中的验证错误

我正在使用一个简单的Sinatra应用程序,现在我得到了"TypeError at/can't dump hash with default proc">

我正在尝试验证一个简单的表单(3个字段(,如果有任何错误,请向输入数据的用户显示这些错误。

以下是我的Sinatra文件的主要部分(至少所有相关信息(:

$LOAD_PATH.unshift(File.dirname(__FILE__))
require 'sinatra'
require 'rubygems'
require 'datamapper'
require 'dm-core'
require 'dm-validations'
require 'lib/authorization'
DataMapper::setup(:default, "sqlite3://#{Dir.pwd}/entries.db")
class Entry
include DataMapper::Resource
property :id,           Serial
property :first_name,   String, :required => true
property :last_name,    String, :required => true
property :email,        String, :required => true, :unique => true,
                        :format => :email_address, :messages => { 
                            :presence => "You have to enter your email address", 
                            :is_unique => "You've already entered", 
                            :format => "That isn't a     valid email address" }
property :created_at,   DateTime    
end
configure :development do
# create, upgrade, or migrate tables automatically
DataMapper.auto_upgrade!
end
enable :sessions
helpers do
include Sinatra::Authorization
end
# Set UTF-8 for outgoing
before do
headers "Content-Type" => "text/html; charset=utf-8"
end

get '/' do
@title = "Enter to win a rad Timbuk2 bag!"
erb :welcome
end
post '/' do
@entry = Entry.new(:first_name => params[:first_name], :last_name => params[:last_name], :email => params[:email])
if @entry.save
    redirect("/thanks")
else
    session[:errors] = @entry.errors
    redirect('/')
end
end

这是我的模板:

<h1><%= @title %></h1>
<form action="/" method="post" id="entry">
<p>
<label>First Name: </label><br />
<input type="text" name="first_name" id="first_name" />
</p>
<p>
<label>Last Name: </label><br />
<input type="text" name="last_name" id="last_name" />
</p>
<p>
<label>Apple Email Address: </label><br />
<input type="text" name="email" id="email" />
</p>
<p>
<input type="submit">
</p>
<% if @errors %>
<div id="errors">
<%@errors.each do |e| %>
   <p><%= e %></p>
<% end %>
</div>
<% end %>

我想这与现在我正在使用会话并试图跟踪错误有关,但我不知所措。

会话似乎不能包含对象,只能包含字符串。你必须像这样更换你的帖子处理程序:

post '/' do
  @entry = Entry.new(:first_name => params[:first_name], :last_name => params[:last_name], :email => params[:email])
  if @entry.save
    redirect("/thanks")
  else
    errors = ""
    entry.errors.each do |err_msg|
      errors << "<p>#{err_msg}</p>n"
    end
    session[:errors] = errors
    redirect('/')
  end
end

(应该可以做得更好(。

您忘记返回并在get处理程序中设置错误信息:

get '/' do
  @title = "Enter to win a rad Timbuk2 bag!"
  @errors = session[:errors]
  erb :welcome
end

然后,由于你的@errors var不再是一个散列而是一个简单的字符串,你必须更新你的视图的末尾welcome.erb:

<% if @errors %>
<div id="errors">
<%= @errors %>
</div>
<% end %>

顺便说一句,你忘了标签<表单>在表单末尾(在<input type="submit"></p>之后(。

它是"需要‘data_mapper’"而不是"需要‘data mapper’":(

相关内容

最新更新