【问题标题】:Define another attribute in setter在 setter 中定义另一个属性
【发布时间】:2015-05-14 01:30:20
【问题描述】:

当我设置 physician 属性时,我想在我的 User 模型中定义一个 role 属性,要知道现在这个属性是定义 User 实例具有 :physician角色(因为它是一个枚举)。

在定义角色时起作用,但是角色被错误地分配给另一个枚举类型,如我的 RSpec 测试中所示

enum role: [:assistant, :physician, :patient]

def physician=(value)
    write_attribute(:role, "physician")
    super(value)
end

RSpec:

User is a physician should only be a physician
     Failure/Error: expect(user.role).to eq('physician')

       expected: "physician"
            got: "assistant"

       (compared using ==)
     # ./spec/models/user_spec

事实上,我试图在 Rails 控制台中手动复制它

user = User.new
physician = Physician.new

user.physician = physician
user.physician?
 => false
user.role
 => "assistant"

我怀疑 write_attribute 不能很好地与 Enums 配合使用...

P.D.我也尝试了 write_attribute(:role, :physician) 但它将角色值设置为 nil

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 enums rspec-rails


    【解决方案1】:

    我认为它是固定的:

    def physician=(value)
        self.send("role=", "physician")
        super(value)
    end
    

    但我不确定像这样直接调用 send 是否是个好主意

    【讨论】:

    • 为什么不只是self.role = "assistant"
    【解决方案2】:

    除非#role= 是私有方法,否则无需使用send。只需直接调用self 上的访问器即可:

    def physician=(value)
      self.role = 'physician'
      super(value)
    end
    

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多