Подумайте о том, чтобы разделить ваши проблемы: я бы подошел к этому, создав отдельную функцию, которая обрабатывает авторизацию.
module AuthorizedText
module_function
def secure_text(text, authorized)
return authorized ? text : 'X' * text.length
end
end
Вызовите это в Car
следующим образом:
AuthorizedText.secure_text("Car Title", authorized_to_level(1))
Вы можете сократить это с помощью удобного метода:
def secure(level, text)
AuthorizedText.secure_text(text, authorized_to_level(level))
end
, чтобы ваш метод car_title
выглядел так:
def car_title
secure(1, "Car Title")
end
Вы могли бы обобщить обертку метода следующим образом:определение метода класса, который позволил бы вам сделать что-то вроде
def car_title
"Car Title"
end
secure :car_title
Но я бы назвал это чрезмерно сложным и в конечном итоге менее читабельным для всех, кто не является вами (включая вас, вероятно, через 8 месяцев!)). Я бы не пытался быть таким причудливым, каким бы забавным это ни было.
Кроме того, если current_user
и current_user_level
имеют смысл вне контекста Car
, и вы можете использовать это повторнов другом месте вы можете пойти дальше, переместив методы проверки подлинности в AuthorizedText
, если это уместно:
module AuthorizedText
module_function
def secure_text(text, user, level = 0)
return authorized?(user, level) ? text : 'X' * text.length
end
def authorized?(user, level)
# for example; I don't know what your user object looks like
user.level >= level
end
end