Как справиться с необязательной принадлежностью

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.

ВОПРОС:

  1. Есть ли лучшее решение для этого?
  2. Есть ли драгоценный камень, который облегчает шаблон нулевого объекта для моделей активной записи рельсов.

2 ответа

Это звучит как идеальный случай для декоратора, который оборачивает ваш пользовательский объект. Вся логика о том, что отображать, идет туда; все, что вас волнует, это то, что он может выплевывать имя объекта.

Draper хорошо работает для декораторов в Rails.

И Railscast для хорошей меры.

Одним из возможных решений было бы установить значение по умолчанию и связать его с гостевым пользователем. Таким образом, он будет переопределен, когда пользователь присутствует, но будет означать, что при вызове.user.name всегда будет значение

Другие вопросы по тегам