0

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

我究竟做错了什么?

4

1 回答 1

2

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

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

  • 测试
  • 耙任务

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

因此,当您遇到错误的 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
于 2013-03-11T18:27:09.767 回答