name
という属性がPerson
モデルにあり、name
属性にアクセスするたびにname.capitalize
が返されます。レールで属性を飾る
モデル内の次の操作を実行すると、動作しません、
def name
name.capitalize
end
ので、代替手段は何ですか?
name
という属性がPerson
モデルにあり、name
属性にアクセスするたびにname.capitalize
が返されます。レールで属性を飾る
モデル内の次の操作を実行すると、動作しません、
def name
name.capitalize
end
ので、代替手段は何ですか?
これを試してみてください:
def name
self[:name].capitalize
end
私は、カスタムフォーマッタを持つ二次メソッドを作成することをお勧めします。
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
もう一度やり直してください。カスタムメソッドを作成してください。
しかし、nameがnullの場合はどうなりますか?
self [:name]がnilを返す場合、capitalizeはnil :: Classの未定義のメソッドをスローします。
以下があることについて説明します
def name
self[:name] ? self[:name].capitalize : nil
end
をしかし、私はあなたがフォーマットされたメソッドを作成しているとして、nameメソッドを残す必要があることに同意するものとします。未処理のデータが必要なときは絶対に知らないでください。
FYI:なぜあなたのメソッドがうまくいかなかったのかという理由は、それが原因であったためです。私が呼びたいものは、自己参照ループです。メソッドを再定義するが、新しいメソッドでメソッドを呼び出す。したがって、self[:name]
またはread_attribute
を使用して内部モデルデータを取得する必要があります。
あなたの最後の提案をお勧めしませんか? def名 自己[:name] .capitalize end エレガントに見えますが、それは単なる属性リーダーです。どうしたの? – user16455
ほとんどのプラグインは名前に依存しているため、self [:name]を呼び出すプラグインがあります。矛盾した値で終わるかもしれません。 –
アクティブレコードhttp://onehub.com/blog/posts/decorating-activerecord-accessor-methods/のメソッドチェーンに問題があります。 – ahmy