2011-11-24 85 views
0

错误要在我的地址簿应用程序管理错误我初始化这样阵在西纳特拉

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

我认为错误是,它的每一个从后“/”得到“/添加”发生变化,所以结果是空数组... 如何时都将重新初始化数组我能解决吗?谢谢大家!

回答

0

如果你想为一个特定访问者请求之间持久化数据需要被存储在错误阵列或者会话或cookie(会话可能是最有意义的)。

幸运的Sinatra会议很容易:http://www.sinatrarb.com/intro#Using%20Sessions。一旦启用,你可以将任何你想要的任何东西放入会话哈希中,所以用session[:errors] = []进行初始化,并用session[:errors] << "An error"推送应该会给你持久的期待。

+0

非常感谢!第二次提交表格后如何清除会话? –

+0

'session.clear'或'session [:errors] .clear'应该可以工作,具体取决于您是要清除所有会话数据还是仅清除错误。 –

+0

谢谢!我尝试着 ! –

0

您正在创建一个局部变量并期望它在请求之间持续存在。这应该如何发生? Sinatra不是心灵的,它只会记住你告诉它记住的东西,而这通常是通过某种数据库或客户端cookie完成的。

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

作为一个风格问题,更多的Ruby的方式做这样的事情是:

err = [ ] # Equivalent to Array.new 

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

而且没有办法在请求中创建一个全局变量? –

+0

在Sinatra中没有这样的全局变量。 Web框架不能像持久性桌面应用程序或长时间运行的脚本那样工作。您必须将其保存到会话或数据库中,以便将其从一个请求携带到另一个请求Carl Zulauf的答案在这方面比我的更具体。 – tadman

+0

请记住,不能保证相同的流程将服务于每一个请求,并且最好永远不要认为这是事实。如果你正在做的事情正确,每个请求都以空白的开头开头,因为在服务器进程中没有保存状态,只有像会话或数据库这样的外部存储。 – tadman