2012-01-06 17 views
4

ステータスの列を持つUserモデルがあります。むしろ私は、だから私は、コードActiveSupport :: StringInquirer in Rails

def status 
    ActiveSupport::StringInquirer.new(self.status) 
    end 

しかし、今、私はあるスタックレベルが深すぎ取得しています以下の追加

user.status.verified? 

を行う必要がありますけれども、私はこの

user.status == 'verified' 

のように毎回文字列比較を行うよりも理解できる。これをどうやって解決するのですか?

私はRails 3.2を使用しています。

答えて

15

statusメソッド内でstatusメソッドを呼び出すと、無限の再帰問題が発生するという問題があります。

def status 
    return unless self['status'] 
    ActiveSupport::StringInquirer.new(self['status']) 
end 

しかし、あなたはそれを必要としない:ここ

ほとんどの答えは次のように、activesupportの:: StringInquirer初期化子を使用することに焦点を当てます。あなたがそのようにそれを行うことができますので、activesupportのは、すべての文字列に問い合わせメソッドを追加します。

def status 
    read_attribute(:status).try(:inquiry) 
end 

それとも、スーパーを単に呼び出すことができます。

def status 
    self['status'].try(:inquiry) 
end 

これはread_attributeを使用するのと同じです。

def status 
    super.try(:inquiry) 
end 
+0

非常に完全な答え! – caesarsol

2

「スタックレベルが深すぎ」エラーを防ぐために、次のコードを使用します。

def status 
    ActiveSupport::StringInquirer.new(self['status']) 
end 
2

あなたはActiveRecordの::ベースのドキュメントで「デフォルトのアクセサを上書き」セクションを読むことをお勧めします:http://api.rubyonrails.org/classes/ActiveRecord/Base.html

基本的には、実際の属性アクセサメソッドを呼び出さずにread_attributeとwrite_attribute(またはself ['attribute']、例えばBaldrick指し示すように)を使って基底の属性にアクセスします。

0

受け入れられた答えは、属性がnilの場合を処理しません。これはより良いです:

def status 
    (read_attribute(:status) || "").inquiry 
end