2009-07-17 6 views
4

nameという属性がPersonモデルにあり、name属性にアクセスするたびにname.capitalizeが返されます。レールで属性を飾る

モデル内の次の操作を実行すると、動作しません、

def name 
    name.capitalize 
end 

ので、代替手段は何ですか?

答えて

0

これを試してみてください:

def name 
    self[:name].capitalize 
end 
13

私は、カスタムフォーマッタを持つ二次メソッドを作成することをお勧めします。

class Person 

    def formatted_name 
    name.capitalize 
    end 

end 

これは、セッターとゲッターは、データベースにレコードを保存/更新/書き込みと呼ばれる可能性があるため、デフォルトの実装を上書きすることに比べて、より良い解決策です。 属性の既定の実装を上書きした時点で、レコードが保存されるたびに、属性が書式設定された値で更新されたことを覚えています。

このようにしたい場合は、alias_method_chainを使用するか、外部モジュールを含む継承を利用できます。

class Person 

    def name_with_formatter 
    name_without_formatter.capitalize 
    end 
    alias_method_chain :name, :formatter 

end 

また、名前を上書きしてread_attribute(:name)をカスタムメソッドから呼び出すこともできます。

def name 
    read_attribute(:name).capitalize 
end 

def name 
    self[:name].capitalize 
end 

もう一度やり直してください。カスタムメソッドを作成してください。

+0

あなたの最後の提案をお勧めしませんか? def名 自己[:name] .capitalize end エレガントに見えますが、それは単なる属性リーダーです。どうしたの? – user16455

+1

ほとんどのプラグインは名前に依存しているため、self [:name]を呼び出すプラグインがあります。矛盾した値で終わるかもしれません。 –

+0

アクティブレコードhttp://onehub.com/blog/posts/decorating-activerecord-accessor-methods/のメソッドチェーンに問題があります。 – ahmy

1

しかし、nameがnullの場合はどうなりますか?

self [:name]がnilを返す場合、capitalizeはnil :: Classの未定義のメソッドをスローします。

以下があることについて説明します

def name 
    self[:name] ? self[:name].capitalize : nil 
end 

をしかし、私はあなたがフォーマットされたメソッドを作成しているとして、nameメソッドを残す必要があることに同意するものとします。未処理のデータが必要なときは絶対に知らないでください。

FYI:なぜあなたのメソッドがうまくいかなかったのかという理由は、それが原因であったためです。私が呼びたいものは、自己参照ループです。メソッドを再定義するが、新しいメソッドでメソッドを呼び出す。したがって、self[:name]またはread_attributeを使用して内部モデルデータを取得する必要があります。

関連する問題