Просто изменение window.location
в JavaScript опасно , потому что пользователь мог все еще совершить нападки кнопка "Назад" и повторно отправить сообщение, которое могло иметь неожиданные результаты (такой как дублирующаяся покупка ). PRG является намного лучшим решением
Использование Отправление/Перенаправление/Получение (PRG) шаблон
Для предотвращения этой проблемы, много веб-приложений используют шаблон PRG — вместо того, чтобы возвратить страницу HTML непосредственно, операция POST возвращает команду перенаправления (использующий код ответа HTTP 303 (иногда 302) вместе с заголовком ответа "Местоположения" HTTP), давая браузеру команду загрузить другую страницу с помощью HTTP-запроса GET. Страница результатов может затем безопасно быть отмечена или перезагружена без неожиданных побочных эффектов.
Удаляет ли дубликаты метод uniq поскольку эти объекты указывают на то же место в памяти или что они содержат идентичную информацию?
Метод полагается на метод eql?
, поэтому он удаляет все элементы, где a.eql? (b) возвращает true.
Точное поведение зависит от конкретного объекта, с которым вы имеете дело.
Например, строки считаются равными, если они содержат один и тот же текст, несмотря на то, что они имеют одинаковое распределение памяти.
a = b = "foo"
c = "foo"
[a, b, c].uniq
# => ["foo"]
Это верно для большей части ядра объектов, но не для рубиновых объектов.
class Foo
end
a = Foo.new
b = Foo.new
a.eql? b
# => false
Ruby рекомендует вам переопределить оператор ==
в зависимости от контекста вашего класса.
В вашем конкретном случае я бы предложил создать объект, представляющий результат twitter и реализуйте свою логику сравнения, чтобы Array.uniq вел себя так, как вы ожидаете.
class Result
attr_accessor :text, :notes
def initialize(text = nil, notes = nil)
self.text = text
self.notes = notes
end
def ==(other)
other.class == self.class &&
other.text == self.text
end
alias :eql? :==
end
a = Result.new("first")
b = Result.new("first")
c = Result.new("third")
[a, b, c].uniq
# => [a, c]
uniq
использует eql?
, как описано в этой ветке .
См. официальную документацию по ruby для различий между ==
, equal?
и eql?
.
Я считаю, что Array.uniq
обнаруживает дубликаты с помощью методов eql?
или ==
объектов, что означает его сравнение на основе содержимого, а не расположения в памяти (при условии, что объекты предоставляют значимую реализацию eql?
на основе содержимого).