2010-04-23 60 views
6

我有一個有回形針附件的模型。Rails - 在沒有url helper的模型虛擬屬性中構建絕對url

該模型在多個電源軌可能被使用的應用程序

我需要一個完整(非相對)URL返回至附件作爲JSON API在別處消費的一部分。

我想抽象回形針方面,有一個簡單的虛擬屬性是這樣的:

def thumbnail_url 
    self.photo.url(:thumb) 
    end 

然而,這只是給我的相對路徑。由於它在模型中,我不能使用URL輔助方法,對吧?

因爲我沒有幫助者支持,所以預先申請應用程序根url的方法是什麼?我想避免硬編碼或向組裝JSON的控制器方法添加代碼。

謝謝

回答

6

url幫助器從傳入的請求中獲取主機名。模型不需要存在的請求,因此您無法使用URL助手。

一種解決方案是將請求主機名傳遞給縮略圖url助手。

def thumbnail_url(hostname) 
    self.photo.url(:thumb, :host => hostname) 
end 

然後從你的控制器稱之爲/視圖這樣

photo.thumbnail_url(request.host) 

事實證明,確實沒有萬無一失的方式來獲得一個服務器的主機名。如果用戶向其/ etc/hosts文件添加條目,則可以使用任何他們想要的主機名訪問服務器。如果您依賴傳入請求的主機名,則可以使用它來分解縮略圖。

因此,我通常在初始化器中硬編碼我的站點的主機名。例如把這個在配置/初始化/ hostname.rb

HOSTNAME = 'whatever' 

- 編輯 -

它looke就像在軌道3,你必須提供:only_path => false參數得到這個工作。下面是從控制檯的例子:

>> app.clients_path :host => 'google.com', :only_path => false 
=> "http://google.com/clients" 
+0

感謝您的書面記錄。這兩種方法是有道理的,我理解模型的侷限性,這是處理它的合理方法。有時我的大腦只是想要彎曲MVC規則:)。 – Nick 2010-04-23 16:42:23

+0

我正在使用存儲作爲本地文件系統,它不適合我。任何提示? – MKumar 2011-07-21 10:43:44

+0

這似乎並不奏效。 – 2011-07-25 02:45:42

0

我發現,你可以在模型的URL傭工如下:

class Photo < ActiveRecord::Base 
    include ActionController::UrlWriter 

    def thumb_url 
    thumb_url(self) 
    end 
end 

警告,但 - 我發現這個拿起主機,但不港口。您可以調查ActionController :: default_url_options以獲取更多詳細信息。

2

在Rails 3.0中,上面給出的包含會導致棄用警告。

在Rails 3.0,使用下面的代碼,而不是包括網址助手:

class Photo < ActiveRecord::Base 
    include Rails.application.routes.url_helpers 
end