2011-12-15 3 views
0

私はソーシャルネットワークのウェブサイトを持っています。"helper"メソッドを含むようにモデルを拡張する

私は、ユーザーのパスを作成し、ユーザーヘルパーメソッド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-draper?view = comments – cristian

答えて

1

まず、ヘルパーがモデルから分離されている理由があります。 MVCパターンによると、あなたのモデルはあなたのヘルパーについて何も知ってはいけません。逆もそうです(後者は通常Railsでは無視されます)。

しかし、あなたはこれをしたい場合、あなたはmodel UsersHelperclass ::Userを行う必要があり、以下:

module UsersHelper 
end 

class User 
end 

この理由は、Rubyのクラスを名前空間ということです。したがって、モデルはUserと呼ばれ、UsersHelper::Userと定義しました。クラス::Userを呼び出すか、モジュールの外でそれを定義すると、ルート名前空間に入ります。

しかし、私が言ったように、これは "正しい"方法ではありません。より良い方法は、あなたがすでにそれをやっているか、あるいはデコレータパターンを使っているかです。

0

ヘルパーがないモデルと、ビューで使用することを意図しているのアイデアをいただければと思います

user.avatarのような場合は、モデルに追加する必要があります。

ヘルパーに貼り付ける場合は、UsersHelperuser_avatarメソッドを追加します。

1

Draperは、あなたが探している機能(表示/プレゼンテーション固有のコードを追加して、作業しているモデルのように「気分」にしている)を実現する優れた仕事です。ドレープの使用を開始した後は、モデル特有のヘルパーのほとんどを削除しました。

基本的には、デコレータを定義して動作します。これはモデルのラッパーのように機能します。デコレータは装飾しているモデルのように見えますが、その上に追加の機能を定義することもできます。さらに、特定のフィールドへのアクセスを制限したり、必要に応じてロックを解除することができます。アプリ/デコレータ/ 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> 
関連する問題