覆盖的属性访问器的返回值

时间:2016-08-04 15:40:32

标签: ruby-on-rails rails-activerecord

我刚刚发现,当我覆盖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_admin设置为true。但表达式

u.is_admin = 'T'

返回'T'而不是true

通过创建全新的Rails 5项目并创建名为User的模型,只有一列is_admin作为boolean,可以轻松复制这一点。在那之后,像我一样覆盖:is_admin,你会看到我所看到的。

关于奇怪的返回值的任何想法?谢谢!

1 个答案:

答案 0 :(得分:2)

赋值运算符始终返回右手值。就那么简单。观察:

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

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