2016-01-12 2 views
0

У меня есть модель 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.username для всех User объектов в моей БД и он должен возвратить за вышеописанный метод 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 заменить ручное определение геттер и сеттер:

class User < ActiveRecord::Base 
    attr_accessor :username 
end 

Взгляните на этот скринкаст, чтобы разъяснить вещи: http://railscasts.com/episodes/16-virtual-attributes

+0

Нет необходимости для меня, чтобы указать 'attr_accessor: username' на моей модели' User'? – marcamillion

+0

Вы можете использовать только 'attr_accessor' вместо ручного ввода getter и setter. – kimrgrey

+0

Если я использую только 'attr_accessor', как мне установить атрибут' username'? Как правило, с заявлением о назначении? – marcamillion