Rails: проверьте, что ссылка не создаст ошибку 404 - PullRequest
2 голосов
/ 05 августа 2010

Итак, у меня есть веб-приложение, где пользователи и не пользователи могут отправлять ссылки на контент. Мое веб-приложение - это сайт, на котором пользователи получают пожертвования на контент, поэтому перед тем, как получать пожертвования, я удостоверяюсь, что пользователи подтверждают, что они являются владельцами веб-сайта.

Таким образом, когда пользователи отправляют ссылку со своего сайта, они получают форму с полем выбора всех сайтов, которые они зарегистрировали и подтвердили. Если пользователи отправляют ссылки на сайты других людей, они получают форму, в которой это просто текстовое поле для: unclaimed_domain (который находится не в БД, а в attr_accessor, который используется как часть метода find_or_create)

... Надеюсь, достаточно справочной информации.

Я пытаюсь реализовать функцию, которая не дает пользователям отправлять ссылки с ошибками 404.

Это моя текущая неудовлетворительная проверка (проверка никогда не проходит):

  require 'net/http'
  require 'nokogiri'
  require 'open-uri'

    def should_not_have_a_404_link
        if unclaimed_domain != nil || unclaimed_domain != "" #attr_accessor field
            domain = unclaimed_domain
        else
            domain = Website.find_by_website_id(self.website_id).domain #select_field
        end
        response = Net::HTTP.start(domain, 80) {|http| http.head("/self.link") }
        if response.code == "404"
            errors.add(:link, "404 Error")
        end         
    end

Другой метод, который я попробовал, был таким:

def should_not_have_a_404_link
    if unclaimed_domain != nil || unclaimed_domain != "" #attr_accessor field
        domain = unclaimed_domain
    else
        domain = Website.find_by_website_id(self.website_id).domain #select_field
    end
   begin
     Nokogiri::HTML(open("http://#{domain}/self.link"))
   rescue
     errors.add(:link, "404 error")
   end
 end

Это работает, когда отправляется новый сайт, но не работает для существующего сайта.

У меня также есть обратный вызов: make_full_link, который может быть частью проблемы

    before_create :make_full_link 
    before_update :make_full_link

   def make_full_link
        website = Website.find(website_id)
        unless self.link.index("http://#{website.domain}")        
        old_link = self.link
        self.link = "http://#{website.domain}/#{old_link}"
        end
    end
end

Есть идеи?

1 Ответ

2 голосов
/ 05 августа 2010

Я полагаю, что я мог бы заблокировать ваши процессы rails (весь динамический контент на вашем сайте), разместив свой собственный супер-медленный http-сервер, который отправляет один или два символа каждые несколько минут и отправляя три, четыре или десять запросов. Это связало бы все ваши процессоры очереди, и больше динамический контент не мог обслуживаться.

Я предлагаю добавить время ожидания к вашим запросам (если вы действительно хотите выполнить онлайн-проверку достоверности) или просто перенести проверку достоверности в автономную задачу, выполняющуюся из cron или по требованию или что-то в этом роде.

Кроме того, вы просто проверяете, что вы не получаете 200 код ответа, а, например, 301, 302 и 307 в порядке, просто требуется больше обработки со стороны клиентов.

Вместо добавления "404 error" к вашему errors я предлагаю добавить фактический код ответа. Это было бы гораздо полезнее, если, например, были установлены средства управления доступом для разрешения доступа для каждого сетевого блока, и ваш хост получает 403 ответов, но сообщает пользователю , что он получает 404 ответов. Это очень разные вещи и должны быть сообщены правильно. (Вы когда-нибудь видели бесполезное сообщение об ошибке IE: «Извините, не удалось подключиться к удаленному хосту, возможно, он не подключен к сети, возможно, он защищен сетью, возможно, DNS не существует, возможно, вы не подключены к Интернету больше "? Я ненавижу это, он не дает никаких подробностей о том, как исправить ситуацию.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...