2011-05-02 20 views
14

Quiero hacer un botón en mi sitio web en el que un usuario pueda hacer clic para informar en un vínculo externo inactivo. El enlace lo tengo en mi columna de enlace que está en mi tabla de artículos.¿Cómo hacer un reportero de enlace muerto?

Quiero crear un simple aviso por correo electrónico que tenga el ID del artículo y el enlace. Estaba pensando en crear un formulario y algún tipo de controlador que pudiera manejar el formulario.

Mi punto de vista debería ser algo como esto: entradas

<% 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 %> 

el ID y la URL no debe ser vista simplemente como un enlace "Informar de enlace roto". Un controlador debe tomar los dos params y enviarme un correo electrónico.

¿Cómo creo un reportero de enlaces externos muertos?

Respuesta

8

Su pregunta podría ser un poco más específico, pero es probable que desee usar algo como Net:HTTP y algo similar a esto:

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 
+0

He actualizado mi pregunta. Lamento no haber sido más específico sobre mi pregunta –

4

Parece que simplemente quiere que sus usuarios puedan reportar enlaces muertos, sin hacer el cheque real. No necesita un formulario para eso, un link_to "text", :controller=>ctrl, :action=>actname, :id=>item_id, :method=>:post debería ser suficiente. Sin mencionar que se vería mejor y causaría menos problemas con el estilo, etc.;) En Rails 3 esto se vería diferente, creo que :remote=>true en lugar de :method=>:post.

El controlador/acción que llame con este link_to debe construir y enviar correo (lea acerca de ActionMailer). De hecho, este controlador realmente puede verificar si el enlace está muerto o no, como sugirió M. Kohl.

Tenga en cuenta que puede pasar más de :controller, :action y :id. Todo lo que pase estará disponible en la matriz params en el controlador/acción.

3

Como usted lo está explicando, solo necesita un usuario mailer that sends informó enlaces rotos, nada inusual.

Otras opciones incluyen la creación de una tarea de rake que itera sobre sus enlaces, e informa sobre los rotos, con un código similar al de Michael Kohl. Esto no requiere que un usuario activa anuncio publicitario:

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

Para un simple reportero enlace roto me acaba de utilizar un ayudante para el código seca, como la siguiente:

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 

le sugiero que wouldn' Necesito usar un formulario, pero si te sientes inclinado, puedes modificarlo. Agregue/elimine parámetros como mejor le parezca, pero la identificación del artículo probablemente sea lo suficientemente simple, puede buscar el enlace real en la parte de atrás. Sólo tiene que utilizar en sus puntos de vista:

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

utilizan algún ujs para asegurarse de que no publicar de nuevo:

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

Espero que esto ayude.

Cuestiones relacionadas