2011-05-02 5 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와 URL 입력은 같은 링크가 "깨진 링크를보고"볼 수는 안된다. 컨트롤러는 두 개의 매개 변수를 가져 와서 전자 메일을 보내야합니다.

간단한 외부 링크 기자는 어떻게 만듭니 까? ,

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 

답변

8

귀하의 질문은 좀 더 구체적으로 수 있지만, 당신은 아마 Net:HTTP이 비슷한 같은 것을 사용하려면 실제 수표를 내지 않고. 이를 위해 양식이 필요하지 않으므로 link_to "text", :controller=>ctrl, :action=>actname, :id=>item_id, :method=>:post으로 충분합니다. 말할 것도없고 좋을 것 같아서 스타일링 등의 문제를 덜 일으킬 것입니다.) 레일즈 3에서는이 모양이 달라 보일 것입니다. :method=>:post 대신에 :remote=>true이라고 생각합니다.

link_to과 함께 호출하는 컨트롤러/동작은 메일을 작성하고 보내야합니다 (약 ActionMailer). 사실,이 컨트롤러는 실제로 링크가 죽었는지 여부를 확인할 수 있습니다. Kohl이 제안했습니다.

:controller, :action:id 이상을 전달할 수 있습니다. 전달한 모든 내용은 컨트롤러/동작의 params 배열에서 사용할 수 있습니다.

+0

내 질문을 업데이트했습니다. 나는 내 질문에 대해 더 구체적으로 언급하지 않아서 미안하다. –

4

는 단순히 사용자가 죽은 링크를보고 할 수 있도록하려는 것 같다 :

3

설명하는대로 mailer that sends 사용자에게 깨진 링크가보고되고 이상한 것은 없어야합니다.

다른 옵션에는 링크를 반복하는 레이크 작업 생성과 마이클 콜 (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!"); 
}); 

희망을.

관련 문제