2011-12-15 36 views
0

我有一種社交網站。將模型擴展爲包含「幫手」方法

我有一個邏輯來爲用戶創建路徑,併爲UsersHelper方法user_path(user)和user_avatar(user)中描述的每個用戶選擇一個頭像。

相反,我想要像user.path和user.avatar這樣的方法,但我不想在模型文件中包含該代碼。

我試圖擴展User類助手裏面:

module UsersHelper 
    class User 
    def avatar 
     ... 
    end 
    end 
end 

這並不工作 - 我添加的方法無法識別(我猜的Rails動態生成對需求的ActiveRecord類,所以我方法不適用?)

我會很感激的想法

+0

看看呈現圖案=> http://railscasts.com/episodes/ 286-布店?鑑於=評論 – cristian 2011-12-15 16:46:44

回答

1

首先,幫助者與模型分開是有原因的。根據MVC模式,您的模型不應該知道任何關於您的幫助者的信息,反之亦然(後者通常在Rails中被忽略)。

但是,如果你想這樣做,你需要做的class ::Usermodel UsersHelper或以下:

module UsersHelper 
end 

class User 
end 

這樣做的原因是,Ruby的命名空間類。所以你定義了UsersHelper::User,而你的模型叫User。調用類::User或在模塊外定義它強制它進入根名稱空間。

但是,正如我所說,這不是「正確」的方式來做到這一點。更好的方法是如何你已經在做,或者可能使用裝飾者模式。

0

助手旨在與看法使用,不與模型。

如果您希望有類似user.avatar的東西,您必須將其添加到您的模型中。

如果你想堅持它的幫手,然後在UsersHelper添加一個user_avatar方法。

1

Draper是一款非常出色的小寶石,能夠很好地實現您所尋找的功能(添加視圖/演示文稿特定代碼,同時使其「感覺」像您正在使用的模型)。在開始使用draper之後,我們已經刪除了幾乎所有的模型特定助手。

基本上,它的工作原理是定義修飾器,它的工作方式類似於模型的包裝。裝飾器的外觀和感覺就像它裝飾的模型,但可以在其上定義附加功能。另外,如果你喜歡,你可以限制訪問某些字段並鎖定內容。

對於你的榜樣,增添了裝飾就這麼簡單:

(在app /裝飾/ user_decorator。RB)

class UserDecorator < ApplicationDecorator 
    decorates :user 

    def avatar 
    # your implementation 
    end 

(在控制器中)

def index 
    respond_with UserDecorator.decorate(User.all) 
end 

(在你的意見)

<div class='avatar'><%= user.avatar %></div> 
<div class='name'><%= user.name %></div>