【问题标题】:Is it bad practice to have two controllers for one model in Ruby on Rails?在 Ruby on Rails 中为一个模型设置两个控制器是不好的做法吗?
【发布时间】:2011-06-30 14:23:21
【问题描述】:
我有一个模型,它通过它持有的参数得到不同的处理,例如它就像一个字符表,它也用于非玩家角色,因为它们共享所有相同的属性。所以它会有一个布尔值或整数来指示它是玩家角色还是非玩家角色。非玩家角色会自动生成随机状态参数和名称。
由于两者使用的方法完全不同,我认为为它们设置不同的控制器类是合乎逻辑的,但这会使单个模型具有两个不同的控制器,并且感觉有些奇怪。
这是不好的做法吗?我应该在一个控制器中完成所有编码吗?
【问题讨论】:
标签:
ruby-on-rails
design-patterns
data-modeling
【解决方案1】:
这完全没问题。您所描述的是基于任务的用户界面,与简单的 CRUD 或资源操作相比,您对捕获工作流或流程更感兴趣。请记住,Rails 中的默认设置是非常基本的。随意扩展基础知识。
【解决方案2】:
在我看来,实际上你应该有两个不同的模型。如果您与对象交互的方式完全不同,正如您所解释的,那么它们真的不应该是同一个类。 Ruby 有一个很好的方法来处理这种情况:模块。您可以使用模块为对象创建共享行为。您甚至可以通过覆盖 ActiveRecord 表名将非玩家角色和角色存储在同一个数据库表中。例如:
module Character
def decrease_hitpoints x
...
end
# other shared functionality can go here
end
class PlayerCharacter < ActiveRecord::Base
set_table_name 'characters'
include Character
end
class NonPlayerCharacter < ActiveRecord::Base
set_table_name 'characters'
include Character
end
在此示例中,PlayerCharacter 和 NonPlayerCharacter 共享相同的表名和 Character 中定义的功能,但它们是不同的对象。
最后,为单个模型使用两个或多个控制器完全没问题,就像构建一个完全不依赖模型的控制器一样。