Как сделать мертвую ссылку репортером? - PullRequest
14 голосов
/ 02 мая 2011

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

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

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

<% 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 не должны быть доступны для просмотра, просто ссылка типа «сообщить о сломанной ссылке». Контроллер должен взять два параметра и отправить мне электронное письмо.

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

Ответы [ 4 ]

8 голосов
/ 02 мая 2011

Ваш вопрос может быть более конкретным, но вы, вероятно, хотите использовать что-то вроде 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
4 голосов
/ 11 мая 2011

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

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 голосов
/ 07 мая 2011

Кажется, что вы просто хотите, чтобы ваши пользователи могли сообщать о неработающих ссылках, не выполняя фактическую проверку. Вам не нужна форма для этого, 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 голосов
/ 08 мая 2011

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

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

# 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
...