2013-03-11 77 views
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 

我在做什么错?

+1

您的photo_from_url定义在哪个文件中? – almathie 2013-03-11 16:11:17

+0

嗨@almathie。 photo_from_url在'link.rb'中定义,并在link_controller.rb的create动作中调用。 – umezo 2013-03-11 16:30:21

回答

2

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

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

  • 测试
  • rake任务

你应该这样永远不会把具有与操纵用户的浏览器,或者您的模型内的用户会话做任何代码。这是控制器的工作。

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

这很有道理。非常感谢您的意见! – umezo 2013-03-11 18:37:35