2016-08-04 25 views
0

Railsモデルのブール値セッターをオーバーライドすると、戻り値が予期せずに動作することがわかりました。オーバーライドされた属性アクセサの戻り値

ここでは単純なUserモデルです。ここで、is_adminはブール値フィールドです。私が望むのはかなり簡単です:キャストString'T''F'truefalseにそれぞれキャストします。

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_admintrueに設定されます。しかし表現

u.is_admin = 'T' 

戻り'T'ではなくtrue

これは、簡単に新しいRailsの5プロジェクトを作成することによって再生しbooleanとして1つの列だけis_adminUserという名前のモデルを作成しています。その後、私がしたように:is_adminをオーバーライドすると、あなたは私が見たものを見るでしょう。

奇妙な戻り値について考えてみましょうか?ありがとう!

答えて

2

割り当て演算子は常に右手の値を返します。そのような単純な。観察:

class Foo 
    def bar=(val) 
    @bar = val.to_s # => "1234" 
    end 
end 

f = Foo.new 
f.bar = 1234 # => 1234 
+0

はいこれは私が信じるものです。しかし、私の場合、これは真実ではありません。セッターの戻り値をオーバーライドしないと正常です。しかしここでスーパーを呼び出すオーバーライドされたバージョンではありません。エラーを再現するのは難しくありません。あなたは私が質問に残したことに従うことができます。 – Xenofex

+0

@Xenofex:「オーバーライドしないで」ブーリアンを割り当てているのですよね?そして、キャストがないので、ブール値を返します。だから、この戻り値がセッターか代入演算子自体から来たものかどうかをどうやって決めるのですか? –

+0

こんにちは、@Sergio Tulentsev、もう一度あなたの答えを読んだ後、私はあなたがここで何を言っているかを見ていると思います。私のオーバーライドがメソッドのように見えても、それは異なります。これは代入演算子で、最後の行ではなく右手の値を返します(または明示的な戻り値を与えることさえできます)。説明ありがとう。これについてのドキュメントやリファレンスはありますか? – Xenofex

関連する問題