【问题标题】:How to rescue from bad url如何从错误的网址中拯救
【发布时间】:2013-03-11 15:15:57
【问题描述】:

我的应用程序中有一个方法可以从提交的链接的 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

但是,如果输入了错误的 url,则会产生错误。 我试图拯救如下,但这给了我一个“未定义的方法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

我做错了什么?

【问题讨论】:

  • 您的 photo_from_url 定义在哪个文件中?
  • 嗨@almathie。 photo_from_url 在link.rb 中定义,并在link_controller.rb 的create action 中调用。

标签: ruby-on-rails rescue


【解决方案1】:

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

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

  • 测试
  • rake 任务

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

因此,当您遇到错误的 url 时,您需要做的只是在模型中引发异常或返回特定值。并通过重定向用户来响应控制器中的异常/返回值。这确保了与用户浏览器有关的任何内容都保留在控制器中,并且如果遇到相同的错误,您可以在 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

【讨论】:

  • 这很有意义。非常感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 2019-09-22
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2010-10-07
  • 2016-06-21
  • 2013-11-27
相关资源
最近更新 更多