【发布时间】:2011-03-25 13:28:42
【问题描述】:
所以我有一个网络应用程序,用户和非用户都可以在其中提交内容链接。我的网络应用程序是一个用户接收内容捐赠的网站,因此我确保用户在接收捐赠之前验证他们是网站的所有者。
因此,当用户从他们自己的网站提交链接时,他们会得到一个表单,其中包含他们已注册和验证的所有网站的选择字段。如果用户为其他人的网站提交链接,他们会得到一个表单,其中它只是 :unclaimed_domain 的文本字段(不在数据库中,而是用作 find_or_create 方法的一部分的 attr_accessor)
...我希望这是足够的背景信息。
我正在尝试实现一项功能,以防止用户提交被证明是 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
有什么想法吗?
【问题讨论】:
标签: ruby-on-rails validation callback