2011-05-02 73 views
14

我想在我的网站上制作一个按钮,用户可以点击以在外部无效链接上进行报告。 链接是否在我的项目表中的链接列中有。如何制作死链接记者?

我想创建一个简单的电子邮件通知,其中包含项目的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和网址输入不应该是可见的,就像一个链接“报告失效链接”。管制员应该拿两个参数并给我发一封电子邮件。

如何创建一个简单的外部链接记者?

回答

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

我已更新我的问题。我很抱歉,我没有更具体的关于我的问题 – 2011-05-02 18:37:27

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阵列中提供。

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

希望这有助于。