我想在我的网站上创建一个用户可以点击外部死链接报告的按钮。 我在项目表中的链接列中有链接。
我想创建一个简单的电子邮件通知,其中包含项目的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输入不应仅仅像“报告断开链接”这样的链接可见。控制器应该接受两个参数并给我发电子邮件。
如何创建一个简单的死外部链接记者?
答案 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