2010-12-29 2 views
1

私はこのトピックについて多くの研究を行いましたが、いくつかの論争があるようですので、私はあなたの意見を得たいと思っていました。ここに私の基本的な状況がある - 私は、Userモデルを持っている:行動のこの種のRails(モデルまたはヘルパー)で「リンク」メソッドを作成する最も良い方法は?

class User < ActiveRecord::Base 
    # User consists of first_name, last_name, and other fields 
    has_one :profile # 1-1 mapping between User and Profile 
        # Profile is a nested resource of User 

    # this is the method up for debate: 
    # this obviously doesn't work unless I include 
    # the necessary modules in this class 
    def link(*args) 
    link_to self.first_name, users_profile_path(self), args 
    end 
end 

私の推論は私の意見では、私のような何かをしたい、ということである:

代わり
<%= @user.link %> 

毎時

<%= link_to @user.name, users_profile_path(@user) ... %> 

です。このリンクは、さまざまなビューで何千回も使用されます。私はこの「方法」を一元化して、変更が必要なときに一度変更できるようにしたいと思います。

しかし、この方法は絶対にMVCアーキテクチャに違反します。その他には、ヘルパーを使用することをお勧め:

module UsersHelper 
    def profile_link(user, *args) 
    link_to user.name, users_profile_path(user), args 
    end 
end 

さて、私が代わりにユーザーONメソッドとして呼び出す方法でユーザーをラップする必要があります。

私の意見では、より醜いです、
<%= profile_link(@user) %> 

後者の例。

私の質問は - それはより良いですか?それとも私が完全に気づいていないことを達成する方法はありますか?

+1

ヘルパーは、そのための適切な場所です。 – Heikki

+0

あなたは私を悩ましていた何かを釘付けにしました。問題の事実は、おそらくヘルパーの90%が、悪い習慣とはみなされていない場合、クラス自体に対して実際にはよりよく定義されるということです。私はあなたがこれに対して良い答えを見つけることを願っています。 – ryeguy

+0

[cells](http://cells.rubyforge.org/examples.html)のチェックアウトを検討することもできます(例[here](http://nicksda.apotomo.de/2010/11/lets-再使用可能なサイドバーコンポーネントインレール3))。 – ryeguy

答えて

3

Railsはすべて慣例によるコーディングです。あなたが指摘したように、モデルのメソッドを使用すると、MVCの規則が破られます。そうするべき魅力的な理由がない限り、あなたはその流れに慣れ、ヘルパーのアプローチを使う方が良いです。

実際の問題の1つはテストです。ヘルパーメソッドをモデルメソッドよりもテストする方が簡単です。ヘルパーテストにはlink_tousers_profile_pathメソッドが含まれています。モデルテストには含まれません。

最後に、あなたのコードを読んでいる他の開発者を考えてみましょう。彼らはどこでこの方法を見つけると期待しますか?あなたがMVCに従えば、彼らの生活が楽になります。

+1

+1今後のメンテナンスを検討する –

1

ヘルパーを使用します。これはビュー・オブジェクト(アンカー・タグ)を作成するメソッドであるため、ヘルパー・モジュールに配置することをお薦めします。

関連する問題