我正在构建一个应用程序,用户可以在其中拥有不同的角色(如卖家,买家,代理商等)。所以我的计划是使用多态关联,为每个角色构建一个类,并将每个实例与一个用户帐户相关联。每个用户只能是其中一种类型,在阅读完这个主题后我得出的结论是,这比使用STI要好,但如果我错了,请纠正我。
因此,应用程序将为主要类型的用户帐户设置不同的注册屏幕。例如,在卖方注册表单中,将发生的是用户将填写其用户帐户所需的详细信息以及特定于卖方配置文件的字段。
因此,此表单应创建用户对象,然后创建与前者关联的卖方对象。你怎么处理这个?我的猜测是,此表单应与卖家控制器的“新”操作相对应,并且在创建操作中,应在最终创建卖家之前创建用户帐户。
这是对的吗?如果是这样,我应该从卖方控制器调用用户控制器创建操作,还是直接调用用户模型?如果是前者请提供一些示例代码,因为我不确定如何从另一个控制器调用一个控制器。
编辑:我还考虑使用多部分表单,这可能更容易,但在决定之前我想查看此选项。答案 0 :(得分:1)
您可以使用嵌套表单。用户有一个角色。您可以查看此railscast:http://railscasts.com/episodes/196-nested-model-form-part-1,它解释了如何使用嵌套表单。您将在创建用户和角色时调用用户控制器。
答案 1 :(得分:1)
如果您一直这样做,我会说只需从卖方控制器的create方法调用模型。用户模型和卖方模型之间有什么样的关系?因为你需要做这样的事情:
def create
user = User.create(params[:user])
seller = Seller.new(params[:seller])
seller.user_id = user.id
seller.save
redirect_to #wherever
end
这里我假设您在卖家模型中有belongs_to :user
。我仍然会建议你考虑使用像cancan这样的宝石来处理角色而不是这种方法。
答案 2 :(得分:0)
我会针对这个问题采取不同的方法。有一个角色类。然后在用户类中创建方法。
def can_assign_users?
roles.map(&:name).includes('admin')
end
否则,您可能会在几年内拥有50个型号。另外还有很多像这样工作的宝石,所以你可以利用它们。