0

用例:

考虑以下示例。

Class Foo < ActiveRecord::Base
 belongs_to :user
 attr_accessible :title
end
Class User < ActiveRecord::Base
 has_many :foo
 attr_accessible :name
end

如果登录用户创建了 Foo,它将与它的用户记录相关联。如果一个未登录的用户创建了 Foo,它不会关联到任何用户。这只是一个示例,我的应用程序中有很多类似的用例。

问题:

问题是我的视图代码被很多 if 条件和三元运算弄乱了,比如,

<% foo.user ? foo.user.name : "not set"%>

当前解决方案:

为了克服这个问题,我使用了空对象设计模式。User 类定义了一个 NullUser 对象(其名称将设置为“未设置”)。如果 foo 对象没有用户对象,它将返回一个 NullUser 对象。我已经覆盖了执行 nil 检查的 Foo 类中的用户方法。

问题:

  1. 有没有更好的解决方案?
  2. 是否有一个 gem 可以促进 Rails 活动记录模型的空对象模式。
4

2 回答 2

1

这听起来像是包装用户对象的装饰器的完美案例。关于显示什么的所有逻辑都在那里;你所关心的只是它可以吐出对象的名称。

Draper非常适合 Rails 中的装饰器。

和一个很好的衡量标准的Railscast

于 2013-04-25T10:20:23.897 回答
0

一种可能的解决方案是设置默认值并将其与来宾用户相关联。这样当用户在场时它会被覆盖,但这意味着当你调用 .user.name 时总会有一个值

于 2013-04-25T10:16:46.037 回答