如何在现有模型上设置虚拟属性?
How do I set a virtual attribute on an existing model?
所以我有一个 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
方法 return。
我怎样才能做到这一点?
我想,你在其他地方有问题。在没有看到代码的情况下很难找出代码出了什么问题,但是这段代码本身可以正常运行:
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
模型,它有一个 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
方法 return。
我怎样才能做到这一点?
我想,你在其他地方有问题。在没有看到代码的情况下很难找出代码出了什么问题,但是这段代码本身可以正常运行:
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