我必须为可以是Teacher,Student,Outsider类型的类Person实现单表继承。
class Person < ActiveRecord::Base
end
class Teacher < Person
end
class Student < Person
end
class Outsider < Person
end
注册新用户时,我需要在路由和表单中进行哪些更改。我在people表中有一个列(字符串)“type”,它可以作为注册新用户的表单中的下拉列表实现。我还需要在表单中执行其他操作,以便将用户注册为特定类型的Person吗?我是否还需要对路线进行任何更改?
答案 0 :(得分:2)
由于您使用一个表单来创建所有类型的人员,因此您应该使用一个控制器,这样您就不需要添加任何其他路径。
type属性并不是你应该手动分配给实例的东西,它应该通过选择要创建的模型类型自动设置。
我不知道它在您的控制器和视图中的外观,但您可以提取模型类型来创建如下:
class_type = params[:type].constantize
@person = class_type.new
另一方面,如果type属性嵌套在视图中的form_for中,那么type属性可能会像params [:person] [:type]一样发送到控制器,在这种情况下,它应该从:person hash用于创建新实例。也许是这样的:
class_type = params[:person].delete(:type).constantize
@person = class_type.new(params[:person])
答案 1 :(得分:1)
除了在表单中添加类型选择的下拉列表外,没有其他事情要做。您可以以正常方式创建用户,例如:
@user = Person.new params[:user]
但type
属性无法进行质量分配,因此您必须单独分配。
@user.type = sanitize_user_type params[:user][:type]
方法sanitize_user_type
用于验证用户输入值。
创建新用户的路线无需更改。其他路线是否需要更改取决于您的要求。实际上,您可以添加Teacher
,Student
,Outsider
和相关控制器的路由,以便您可以构建安静的网址。