2016-01-12 89 views
0

所以我有一個User模型,它有一個first_namelast_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方法返回。

我該如何做到這一點?

回答

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

+0

沒有必要讓我在我的'用戶'模型上指定'attr_accessor:username'? – marcamillion

+0

您只能使用'attr_accessor'而不是手動執行的getter和setter。 – kimrgrey

+0

如果我只使用'attr_accessor',我該如何設置'username'屬性?通常只有一個賦值語句? – marcamillion