【问题标题】:How do I set a virtual attribute on an existing model?如何在现有模型上设置虚拟属性?
【发布时间】:2016-01-12 22:05:25
【问题描述】:

所以我有一个User 模型,它有一个first_name 和last_name 列。

我想创建一个名为username 的新虚拟属性,我什至可以在我的路由文件中访问它。

我试过这样做:

attr_accessor :username 

  # getter
  def username
    @username
  end

  # setter
  def username=(user)
    @username = "#{user.first_name}.#{user.last_name}"
  end

但是当我尝试设置它时,我得到了错误数量的参数错误。

[27] pry(main)> u.username=(u)
ArgumentError: wrong number of arguments (1 for 0)
from     
[28] pry(main)> u.username = u
ArgumentError: wrong number of arguments (1 for 0)
from 

u 是有效的User 记录。

理想情况下,我想做两件事。我希望能够检查我的数据库中所有User 对象的user.username,它应该按照上述setter 方法返回。

我怎样才能做到这一点?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 attributes attr


    【解决方案1】:

    我认为,您在其他地方有问题。不看代码很难找出问题所在,但这段代码本身可以正常工作,没有任何错误:

    class User < ActiveRecord::Base
      def username=(value)
        @username = value
      end
    
      def username
        @username
      end
    end
    
    user = User.new(:first_name => "Bill", :last_name => "Gates")
    user.username = "billgates"
    user.username
    

    或者你可以使用attr_accessor来代替手动定义的getter和setter:

    class User < ActiveRecord::Base
      attr_accessor :username
    end
    

    观看此截屏视频以澄清事情:http://railscasts.com/episodes/16-virtual-attributes

    【讨论】:

    • 我不需要在我的User 模型上指定attr_accessor :username 吗?
    • 只能使用attr_accessor,而不是手动实现的getter和setter。
    • 如果我只使用attr_accessor,如何设置username 属性?只是通常带有赋值语句?
    • 是的,attr_accessor 只是一个为你定义 getter 和 setter 的方法。在我上面的回答中添加了这个事实。
    • 嗯,好的。我想我必须两者都做。这可能是问题所在。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多