sinatra中的错误数组

时间:2011-11-24 14:59:00

标签: ruby arrays error-handling sinatra

要管理我的地址簿应用中的错误,我会像这样初始化一个数组

err = Array.new

然后当我发布一些东西时它检查是否有空字段。如果是,对于每个空字段,它在数组中添加一条记录,然后重定向到/添加页面,如下所示

post '/' do
if params[:fname] == ""
    err.push "Insert a valid first name"
end
if params[:lname] == ""
    err.push "insert a valid last name"
end
if params[:phone] == ""
    err.push "insert a valid phone number"
end
if params[:mail] == ""
    err.push "insert a valid e-mail address"
end
if err.empty?
    c = Contatto.new
    c.fname = params[:fname]
    c.lname = params[:lname]
    c.phone = params[:phone]
    c.mail = params[:mail]
    c.save
    redirect '/'
else
    redirect '/add'
end
end

然后添加页面读取数组是否有任何记录,如果是,则循环它以打印每条消息

get '/add' do
  @err = err
  @title = 'Aggiungi'
  erb :aggiungi
end



<% if @err.any? %>
<div class="error">
    <% @err.each do |err| %>
        <%= err %><br>
    <% end %>
</div>
<% end %>

我认为错误是它每次从发布'/'更改为'/ add'时重新初始化数组,因此结果为空数组... 我怎么解决?谢谢大家!

2 个答案:

答案 0 :(得分:0)

您正在创建一个本地变量,并希望它在请求之间保持不变。这怎么会发生? Sinatra不是通灵的,它只会记住你要记住的内容,而这通常是通过某种数据库或客户端cookie完成的。

通常,您应该在失败时呈现响应页面,利用您收集的错误,或者在成功时重定向,其中空错误数组不相关。

作为一种风格问题,Ruby的做法是:

err = [ ] # Equivalent to Array.new

err << "Example error" # Equivalent to err.push

答案 1 :(得分:0)

如果您希望特定访问者的数据在请求之间保持不变,则需要将错误数组存储在会话或cookie中(会话可能最有意义)。

幸运的是,在Sinatra的会议非常简单:http://www.sinatrarb.com/intro#Using%20Sessions。启用后,您可以将任何您想要的内容放入会话哈希中,因此使用session[:errors] = []进行初始化并使用session[:errors] << "An error"进行初始化可以为您提供所需的持久性。