如何从坏网址中拯救

时间:2013-03-11 15:15:57

标签: ruby-on-rails rescue

我的应用程序中有一个方法,可以从提交的链接的og:image标记中找到照片。在我的创建操作中,我使用方法photo_form_url,如下所述。

def photo_from_url(url)
  if !Nokogiri::HTML(open(url)).css("meta[property='og:image']").blank?
    photo_url = Nokogiri::HTML(open(url)).css("meta[property='og:image']").first.attributes["content"]
    self.photo = URI.parse(photo_url)
    self.save
  end 
end

但是,如果输入了错误的网址,则会产生错误。 我尝试如下救援,但这给了我一个“未定义的方法redirect_to”

def photo_from_url(url)
  begin
    if !Nokogiri::HTML(open(url)).css("meta[property='og:image']").blank?
      photo_url = Nokogiri::HTML(open(url)).css("meta[property='og:image']").first.attributes["content"]
      self.photo = URI.parse(photo_url)
      self.save
    end
  rescue OpenURI::HTTPError
    redirect_to :back, notice: 'link's broken!'
  end
end

我做错了什么?

1 个答案:

答案 0 :(得分:2)

根据您对我的评论的回答,您的函数photo_from_url在模型中定义。尝试在模型中重定向用户是不可能的,如您所面临的错误所示。

请记住,您的模型可以在浏览会话环境之外调用。 EG:

  • 测试
  • rake task

因此,您永远不应该放置任何与操作用户浏览器或模型中的用户会话有关的代码。这是控制器的工作。

因此,您需要做的只是在遇到错误的网址时引发异常或在模型中返回特定值。并通过重定向用户对控制器中的异常/返回值做出反应。这确保了与用户浏览器有关的任何内容都保留在控制器中,并且如果遇到相同的错误,您可以在rake任务中实现不同的行为。

所以,你的模型应该做的事情,并在不能的时候引发错误:

# Link.rb
def photo_from_url(url)
  if !Nokogiri::HTML(open(url)).css("meta[property='og:image']").blank?
    photo_url = Nokogiri::HTML(open(url)).css("meta[property='og:image']").first.attributes["content"]
    self.photo = URI.parse(photo_url)
    self.save
  end 
end

您的控制器应该让您的模型做一些事情,并在出现问题时与用户打交道:

# link_controller
# in create
begin
  link.photo_from_url(url)
rescue OpenURI::HTTPError
   redirect_to :back, notice: 'link's broken!'
end