Массив для ошибок в синатре - PullRequest
0 голосов
/ 24 ноября 2011

Для управления ошибками в моем приложении адресной книги я инициализирую массив, подобный этому

err = Array.new

, а затем, когда я публикую что-то, он проверяет, есть ли пустые поля.Если да, то для каждого пустого поля он добавляет запись в массив, а затем перенаправляет на страницу / add, например:

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

Я думаю, что ошибка в том, что он переинициализирует массив каждый раз, когда он изменяется от post '/' to get '/ add', и в результате получается пустой массив... Как я могу решить?спасибо всем!

Ответы [ 2 ]

0 голосов
/ 24 ноября 2011

Если вы хотите, чтобы данные о конкретном посетителе сохранялись между запросами, вам нужно хранить массив ошибок либо в сеансе, либо в cookie (сеанс, вероятно, наиболее целесообразен).

К счастью, сеансы в Sinatraдовольно просто: http://www.sinatrarb.com/intro#Using%20Sessions.После включения вы можете поместить в хеш сессии почти все, что захотите, поэтому инициализация с session[:errors] = [] и нажатие с session[:errors] << "An error" должны дать вам постоянство, которое вы ищете.

0 голосов
/ 24 ноября 2011

Вы создаете локальную переменную и ожидаете, что она сохранится между запросами.Как это должно произойти?Синатра не экстрасенс, он будет помнить только то, что вы говорите, чтобы помнить, и это обычно делается с помощью какой-то базы данных или cookie-файла на стороне клиента.

Как правило, вы должны отобразить страницу ответа на неудачу, используяошибок, которые вы собрали, или перенаправьте в случае успеха, когда пустой массив ошибок не имеет значения.

В стиле, более подходящий Ruby способ сделать такие вещи:

err = [ ] # Equivalent to Array.new

err << "Example error" # Equivalent to err.push
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...