要管理我的地址簿应用中的错误,我会像这样初始化一个数组
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'时重新初始化数组,因此结果为空数组... 我怎么解决?谢谢大家!
答案 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"
进行初始化可以为您提供所需的持久性。