2011-12-15 48 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>