Итак, у меня есть веб-приложение, где пользователи и не пользователи могут отправлять ссылки на контент. Мое веб-приложение - это сайт, на котором пользователи получают пожертвования на контент, поэтому перед тем, как получать пожертвования, я удостоверяюсь, что пользователи подтверждают, что они являются владельцами веб-сайта.
Таким образом, когда пользователи отправляют ссылку со своего сайта, они получают форму с полем выбора всех сайтов, которые они зарегистрировали и подтвердили. Если пользователи отправляют ссылки на сайты других людей, они получают форму, в которой это просто текстовое поле для: 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
Есть идеи?