Звучит так, будто вы хотите, чтобы динамический метод обрабатывал аспект public_view ваших полей.
API для него не будет @user.email.public_view
, поскольку для этого потребуется public_view
, чтобы быть методом класса email
. Скорее примерно так:
@user.public_view_email # returns either the value of the #email method
# or "HIDDEN", depending on the #hidden attribute
@user.public_view_phone
# more generally, handle ALL fields in the form: @user.public_view_<field name>
Как это сделать
Используйте метод method_missing
для обработки методов. Это тот же метод, который используется для динамических методов Active Record find_by_foo. A сообщение в блоге об этом.
Пример, который НЕ проверен:
class User < ActiveRecord::Base
def method_missing(method, *args)
if method.to_s =~ /^public_view_(.*)$/
hidden ? "HIDDEN" : send $1
else
super
end
end
# also handle responds_to?
def respond_to?(method, include_private = false)
if method.to_s =~ /^public_view_(.*)$/
true
else
super
end
end
end