Трудно получить доступ к ошибкам проверки в Синатре - PullRequest
2 голосов
/ 07 июля 2011

У меня есть очень простая форма, с некоторыми очень простыми проверками (хотя мне нужно создать пользовательскую проверку позже ... вы, вероятно, увидите вопрос по этому вопросу завтра. = P), но у меня возникают проблемы с показом пользователь ошибки проверки.

Вот мой основной файл Синатры:

$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 %>

но я получаю: неопределенный метод `errors 'для nil: NilClass

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

То, что происходит в вашем случае, это то, что перенаправление снова очистит ошибки внутренне.Вам необходимо временно их хранить, чтобы они были доступны после перенаправления.Из документации 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

и

if @entry.save
    redirect("/thanks")
else
    session[:errors] = @entry.errors.values.map{|e| e.to_s}
    redirect('/')
end

для вашей Sinatraфайл.

Ваш файл erb станет

<% if @errors %>
<div id="errors">
    <% @errors.each do |e| %>
       <p><%= e %></p>
    <% end %>
</div>
<% end %>
0 голосов
/ 07 июля 2011

Можете ли вы попробовать это:

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
...