Как справиться с необязательной принадлежностью
USECASE:
Рассмотрим следующий пример.
Class Foo < ActiveRecord::Base
belongs_to :user
attr_accessible :title
end
Class User < ActiveRecord::Base
has_many :foo
attr_accessible :name
end
Если вошедший в систему пользователь создает Foo, он будет связан с его записью пользователя. Если не авторизованный пользователь создает Foo, он не будет связан ни с одним пользователем. Это всего лишь пример, и у меня есть много подобных случаев использования в моем приложении.
ПРОБЛЕМА:
Проблема в том, что мой код представления загроможден множеством условий и троичных операций, таких как,
<% foo.user ? foo.user.name : "not set"%>
ТЕКУЩЕЕ РЕШЕНИЕ:
Чтобы преодолеть это, я использую шаблон проектирования нулевого объекта. Класс User определяет объект NullUser (имя которого будет установлено как "не установлено"). Если объект foo не имеет пользовательского объекта, он вернет объект NullUser. Я переопределил пользовательский метод в классе Foo, который выполняет проверку nil.
ВОПРОС:
- Есть ли лучшее решение для этого?
- Есть ли драгоценный камень, который облегчает шаблон нулевого объекта для моделей активной записи рельсов.
2 ответа
Это звучит как идеальный случай для декоратора, который оборачивает ваш пользовательский объект. Вся логика о том, что отображать, идет туда; все, что вас волнует, это то, что он может выплевывать имя объекта.
Draper хорошо работает для декораторов в Rails.
И Railscast для хорошей меры.
Одним из возможных решений было бы установить значение по умолчанию и связать его с гостевым пользователем. Таким образом, он будет переопределен, когда пользователь присутствует, но будет означать, что при вызове.user.name всегда будет значение