如何在Rails中为单表继承创建Controller?

时间:2010-05-27 02:16:50

标签: ruby-on-rails single-table-inheritance

我正在设置单表继承,使用ContactEvent作为ContactEmail,ContactLetter和ContactCall都将继承的模型。

但我对如何创建路由和控制器感到难过。

例如,假设我想创建一个类型为Email的新ContactEvent。

我想要一种方法来执行以下操作:

new_contact_event_path(contact, email)

这将从Contact模型和Email模型中获取实例。

在内部,我认为contact_event_controller需要知道......

   @contact_event.type = (params[:email]) # get the type based on what was passed in?
   @contact_event.event_id = (params[:email]) #get the id for the correct class, in this case Email.id

不确定这是如何运作的......

2 个答案:

答案 0 :(得分:3)

我有类似的问题。

请参阅here how I solved it

答案 1 :(得分:0)

我会为每种资源类型设置一个控制器(可能还有视图)。因此,为ContactLetter等添加一个ContactEmail控制器。不要为基类ContactEvent打扰一个。然后你的路径会读到:

new_contact_email_path(@contact) or new_contact_letter_path(@contact)

然后,控制器操作将使用他们所代表的正确模型,即:

@contact_email = ContactEmail.new(params[...])

如果您可以将三种类型的资源分开,而不是尝试传递类型并在一个控制器中构建正确的对象,那么您应该更容易找到生活。缺点是你可能需要在前端有更多的链接/表单/视图,但是根据你的应用程序,从用户的角度来看可能不是一件坏事。