2011-05-02 71 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!"); 
}); 

希望這有助於。