Ruby 难以访问Sinatra中的验证错误
我有一个非常基本的表单,有一些非常基本的验证(尽管我以后需要创建一个自定义验证…明天您可能会看到一个关于这个的问题。=p),但是我很难向用户显示验证错误 这是我的主要Sinatra文件:Ruby 难以访问Sinatra中的验证错误,ruby,sinatra,datamapper,Ruby,Sinatra,Datamapper,我有一个非常基本的表单,有一些非常基本的验证(尽管我以后需要创建一个自定义验证…明天您可能会看到一个关于这个的问题。=p),但是我很难向用户显示验证错误 这是我的主要Sinatra文件: $LOAD_PATH.unshift(File.dirname(__FILE__)) require 'sinatra' require 'rubygems' require 'datamapper' require 'dm-core' require 'dm-validations' require 'lib
$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
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
@entry.errors.each do |e|
puts e
end
redirect('/')
end
end
get '/list' do
require_admin
@title = "List of Entries"
@entries = Entry.all(:order => [:created_at.desc])
erb :list
end
get '/thanks' do
erb :thanks
end
get '/delete/:id' do
require_admin
entry = Entry.get(params[:id])
unless entry.nil?
entry.destroy
end
redirect('/list')
end
因此,如果用户试图提交一个只有名字、姓氏或根本没有名字的条目,我可以在控制台中看到错误,但我不知道如何在主处理程序显示的页面中获取它们
我尝试添加一个div:
<% unless @entry.errors.empty? %>
<div id="errors">
<% @entry.errors.each do |e| %>
<p><%= e %></p>
<% end %>
</div>
<% end %>
但是我得到:nil:NilClass的未定义方法'errors'你能试试这个吗:
post '/' do
@entry = Entry.new(:first_name => params[:first_name], :last_name => params[:last_name], :email => params[:email])
if @entry.save
redirect("/thanks")
else
@title = "Enter to win a rad Timbuk2 bag!"
erb: welcome
end
end
在您的情况下,重定向将在内部再次清除错误。您需要临时存储它们,以便在重定向后它们可用。关于如何通过重定向传递数据的Sinatra文档:
Or use a session:
enable :session
get '/foo' do
session[:secret] = 'foo'
redirect to('/bar')
end
get '/bar' do
session[:secret]
end
因此,在你的情况下,这将是
get '/' do
@title = "Enter to win a rad Timbuk2 bag!"
@errors = session[:errors]
erb :welcome
end
及
为了你的Sinatra档案
您的erb文件将成为
<% if @errors %>
<div id="errors">
<% @errors.each do |e| %>
<p><%= e %></p>
<% end %>
</div>
<% end %>
谢谢。我添加了会话代码(包括enable和session[:errors]=@entry.errors行,但我仍然得到相同的NoMethod错误。如果我添加div的erb代码错误?这完全有道理。再次感谢您。我现在得到了“TypeError at/can dump hash with default proc”。0.o…嗯,您是否输入了“enable:session”在文件顶部附近的某个位置?需要在使用它的方法之前添加它…在erb文件或Sinatra文件中?需要封送会话。您将找到说明。
<% if @errors %>
<div id="errors">
<% @errors.each do |e| %>
<p><%= e %></p>
<% end %>
</div>
<% end %>