Большое спасибо, ребята. Я использовал смесь предложений Стива и Амиэль, чтобы найти решение, которое работает:
В модели сайта:
class Website < ActiveRecord::Base
require 'net/http'
belongs_to :user
before_create :generate_unique_id
# Validate unless already validated
def verify!
verify_unique_id unless self.verified == true
end
protected
# Generate a random string for unique_id
def generate_unique_id
self.unique_id = ActiveSupport::SecureRandom.hex(10)
end
def verify_unique_id
response = Net::HTTP.start(self.domain, 80) {|http| http.head("/# {unique_id}.html") }
self.verified = true if response.code == "200"
end
end
Контроллер практически не изменился по предложению Стива, за исключением части, где приложение находит идентификатор веб-сайта:
def verify
@website = Website.find_by_id(params[:website])
@website.verify!
respond_to do |format|
if @website.save && @website.verified == true
flash[:notice] = 'Site verified!'
format.html { redirect_to(websites_path) }
format.xml { head :ok }
else
flash[:notice] = 'Site verification failed!'
format.html { redirect_to(websites_path) }
format.xml { render :status => :unprocessable_entity }
end
end
end
Наконец-то у меня есть индексное представление сайтов пользователя (это некрасиво, но оно выполняет свою работу):
<% for website in @websites %>
<%= link_to "#{website.domain}", website %> |
<% if website.verified? %> VERIFIED |
<% else %> NOT VERIFIED
<%= link_to "Verify your website", verify_website_path(:website => website.id), :id => website.id %>
Verification key: <%= website.unique_id %>
<% end %><% end %>
<%= link_to "Add a website", new_website_path %>
В любом случае, я провел несколько ручных тестов на одном из моих существующих веб-сайтов, и он работает без проблем. Мне все еще, конечно, нужно выполнить другие проверки, но это было то, что мне действительно нужно помочь. Спасибо, ребята!
Kenji