2011-02-07 6 views
0

モデルには、:hidden,:phoneおよび:emailというフラグがあります。どのフィールドを適用しているかを「知る」方法を柔軟にしていますか?

public_viewというメソッドを作成して、 "HIDDEN"またはそれが適用されているフィールドの値をDNCフラグに渡すことなく返すことをお勧めします。 @user.hiddenに基づいて、電話、または "HIDDEN"、:Eメール、または@user.hiddenに基づいて、 "HIDDEN"、および@user.phone.public_viewリターン:

だから、@user.email.public_viewを返します。私はこれを行うためのいくつかの非常に素晴らしいクラス/ Rubyの方法がある疑いがある

def public_view 
    self.SOMETHING.hidden ? "HIDDEN" : self.SOMETHINGELSE 
end 

:よう

何か?

答えて

2

ダイナミックメソッドがフィールドのpublic_viewを処理するようにしたいと思うようです。

@user.email.public_viewのフィールドは、フィールドクラスのメソッドである必要があります。むしろ、このようなものは:

@user.public_view_email # returns either the value of the #email method 
         # or "HIDDEN", depending on the #hidden attribute 

@user.public_view_phone 
# more generally, handle ALL fields in the form: @user.public_view_<field name> 

それは メソッドを処理するためにmethod_missingメソッドを使用して行う方法。これは、Active Recordのfind_by_foo動的メソッドに使用されるのと同じテクニックです。これにはblog postがあります。

テストされていない例:

class User < ActiveRecord::Base 
    def method_missing(method, *args) 
    if method.to_s =~ /^public_view_(.*)$/ 
     hidden ? "HIDDEN" : send $1 
    else 
     super 
    end 
    end 

    # also handle responds_to? 
    def respond_to?(method, include_private = false) 
    if method.to_s =~ /^public_view_(.*)$/ 
     true 
    else 
     super 
    end 
    end 
end 
+0

偉大な回答のおかげで...私はクリックを無視するのstackoverflow、それを受け入れるotのクリックした理由はわかりません。 – jpwynn

0

もしあなたが?演算子を使用すると、それを方法の中に因数分解することができます。しかし、私はあなたが特別な宝石や他のソリューションを使用することを超えてコードの簡素化の面で多くを得るとは確信していません。

これは私が直接的、読みやすい、最小限のアプローチを使用する場合の1つです。

関連する問題