Как сделать мертвого репортера ссылок?

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

Я хочу создать простое уведомление по электронной почте, в котором есть идентификатор элемента и ссылки. Я думал создать форму и какой-то контроллер, который мог бы обрабатывать форму.

Мое мнение должно выглядеть примерно так:

<% for items in @items %>
        <%= simple_form_for @items] do |f| %>
        <%= f.hidden field :id, :value => 'item.id' %>
        <%= f.hidden field :url, :value => 'item.link %>
        <%= f.button :submit, :value => 'report broken link' %>
    <% end %>
 <% end %>

Идентификаторы id и url не должны отображаться только как ссылка, например "Сообщить о неработающей ссылке". Контроллер должен взять два параметра и отправить мне электронное письмо.

Как создать простой мертвый внешний репортер ссылок?

Ответы

Ответ 1

Ваш вопрос может быть немного более конкретным, но вы, вероятно, захотите использовать что-то вроде Net:HTTP и что-то похожее на это:

  uri = URI.parse(url)
  response = nil

  begin
    Net::HTTP.start(uri.host, uri.port) do |http|
      response = http.head(uri.path.size > 0 ? uri.path : "/")
    end
  rescue => e 
    ...
  end

  # handle redirects if you need to
  if response.is_a?(Net::HTTPRedirection)
   ...
  end

  if response.code == '404'
    ...
  end

Ответ 2

Кажется, вы просто хотите, чтобы ваши пользователи могли сообщать о мертвых ссылках, не выполняя фактическую проверку. Вам не нужна форма для этого, a link_to "text", :controller=>ctrl, :action=>actname, :id=>item_id, :method=>:post должно быть достаточно. Не говоря уже о том, что это выглядело бы лучше и вызывало меньше проблем с стилем и т.д.;) В Rails 3 это выглядело бы иначе, я думаю :remote=>true вместо :method=>:post.

Контроллер/действие, которое вы вызываете с помощью этого link_to, должно конструировать и отправлять почту (читайте о ActionMailer). Фактически, этот контроллер может проверить, мертв ли ​​канал или нет, как предположил М. Коль.

Обратите внимание, что вы можете пройти более :controller, :action и :id. Все, что вы передадите, будет доступно в массиве params в контроллере/действии.

Ответ 3

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

module ApplicationHelper
  def report_broken_link_for( id )
    link_to "report broken link", {:controller => "reporting", :action => "report_broken_link", :id => id}, :class => "broken_link_reporter_link", :remote => true
  end

Я предлагаю вам не использовать форму, но если вы чувствуете такую ​​склонность, вы можете изменить помощника. Добавьте/удалите параметры по своему усмотрению, но идентификатор элемента, вероятно, будет достаточно простым, вы можете найти фактическую ссылку в конце. Просто используйте его в своих представлениях:

<% @items.each do |item| %> 
  <%= link_to item.url %>
  <%= report_broken_link_for item.id %><br/>
<% end %>

Используйте некоторые ujs, чтобы убедиться, что они не отправляют его:

$('.broken_link_reporter_link')
   .live('ajax:success', function(evt, data, status, xhr){
      $(this).replaceWith("thanks!");
 });

Надеюсь, что это поможет.

Ответ 4

Как вы это объясняете, вам просто нужна почтовая программа, которая отправляет сообщения о неработающих ссылках, ничего необычного.

Другие варианты включают создание рейк-задачи, которая выполняет итерации по вашим ссылкам, и сообщает об ошибках с кодом, подобным Майклу Колю. Это не требует пользовательской почтовой программы:

# In lib/tasks/ (rake links:test)
require 'net/http'    
namespace :links do
  desc "Test for broken links in DB."
  task :test => :environment do |t, args|
    count = 0
    Entries.all.each do |e|
      count += 1
      # is_live? implementation is similar to Michael's
      puts "ERR: #{e.url} (Entry id: #{e.id})" unless is_live?(e.url)
    end
    puts "#{count} tested links."
  end
end