0
Railsモデルのブール値セッターをオーバーライドすると、戻り値が予期せずに動作することがわかりました。オーバーライドされた属性アクセサの戻り値
ここでは単純なUser
モデルです。ここで、is_admin
はブール値フィールドです。私が望むのはかなり簡単です:キャストString
'T'
、'F'
をtrue
、false
にそれぞれキャストします。
class User < ApplicationRecord
def is_admin=(value)
case value
when 'T'
super(true)
when 'F'
super(false)
else
super
end
end
end
キャストは正常に動作します。 u = User.new; u.is_admin = 'T'
はu.is_admin
〜true
に設定されます。しかし表現
u.is_admin = 'T'
戻り'T'
ではなくtrue
。
これは、簡単に新しいRailsの5プロジェクトを作成することによって再生しboolean
として1つの列だけis_admin
でUser
という名前のモデルを作成しています。その後、私がしたように:is_admin
をオーバーライドすると、あなたは私が見たものを見るでしょう。
奇妙な戻り値について考えてみましょうか?ありがとう!
はいこれは私が信じるものです。しかし、私の場合、これは真実ではありません。セッターの戻り値をオーバーライドしないと正常です。しかしここでスーパーを呼び出すオーバーライドされたバージョンではありません。エラーを再現するのは難しくありません。あなたは私が質問に残したことに従うことができます。 – Xenofex
@Xenofex:「オーバーライドしないで」ブーリアンを割り当てているのですよね?そして、キャストがないので、ブール値を返します。だから、この戻り値がセッターか代入演算子自体から来たものかどうかをどうやって決めるのですか? –
こんにちは、@Sergio Tulentsev、もう一度あなたの答えを読んだ後、私はあなたがここで何を言っているかを見ていると思います。私のオーバーライドがメソッドのように見えても、それは異なります。これは代入演算子で、最後の行ではなく右手の値を返します(または明示的な戻り値を与えることさえできます)。説明ありがとう。これについてのドキュメントやリファレンスはありますか? – Xenofex