2013-03-11 78 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