怎么做一个死链接记者?

时间:2011-05-02 14:18:15

标签: ruby-on-rails ruby ruby-on-rails-3 actionmailer

我想在我的网站上创建一个用户可以点击外部死链接报告的按钮。 我在项目表中的链接列中有链接。

我想创建一个简单的电子邮件通知,其中包含项目的ID和链接。 我在想创建一个表单和某种可以处理表单的控制器。

我的观点应该是这样的:

<% 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 个答案:

答案 0 :(得分:8)

您的问题可能更具体一些,但您可能希望使用类似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

答案 1 :(得分:4)

似乎您只是希望您的用户能够报告死链接,而无需进行实际检查。您不需要表单,link_to "text", :controller=>ctrl, :action=>actname, :id=>item_id, :method=>:post就足够了。更不用说它会看起来更好并且造成更少的样式问题等;)在Rails 3中,这看起来会有所不同,我认为:remote=>true而不是:method=>:post

使用此link_to调用的控制器/操作应构造并发送邮件(阅读ActionMailer)。实际上,这个控制器实际上可以检查链接是否已经死亡,正如M. Kohl建议的那样。

请注意,您可以传递的时间超过:controller:action:id。您传递的所有内容都将在控制器/操作中的params数组中提供。

答案 2 :(得分:4)

对于一个简单的断链记者,我会使用一个帮助干代码,如下所示:

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

我建议您不需要使用表单,但如果您有这种倾向,可以修改帮助程序。根据需要添加/删除参数,但项目ID可能很简单,您可以在后端查找实际链接。只需在您的视图中使用它:

<% @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!");
 });

希望这有帮助。

答案 3 :(得分:3)

正如您所解释的那样,您只需要mailer that sends个用户报告断开的链接,没什么不寻常的。

其他选项包括创建一个遍历链接的rake任务,并报告损坏的任务,代码类似于Michael Kohl。这不需要用户触发的邮件程序:

# 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