1

我必须为可以是教师、学生、局外人类型的人员实施单表继承。

class Person < ActiveRecord::Base

end


class Teacher < Person

end

class Student < Person

end

class Outsider < Person

end

注册新用户时,我需要对路线和表格进行哪些更改。我在人员表中有一个列(字符串)“类型”,它可以实现为表单中的下拉列表以注册新用户。我还需要在表单中做些什么,以便将用户注册为特定类型的人吗?我是否也需要对路线进行任何更改?

4

2 回答 2

2

由于您使用一种表单来创建所有类型的人员,因此您也应该坚持使用一个控制器,这样您就不需要添加任何额外的路由。

type 属性并不是你应该手动分配给实例的东西,它应该通过选择要创建的模型类型来自动设置。

我不知道它在您的控制器和视图中的外观,但您可以提取模型的类型以创建如下:

class_type = params[:type].constantize
@person = class_type.new

另一方面,如果 type 属性嵌套在您的视图中的 form_for 中,则 type 属性可能会像 params[:person][:type] 一样发送到控制器,在这种情况下,它应该从 :person 哈希中删除在它用于创建新实例之前。也许是这样的:

class_type = params[:person].delete(:type).constantize
@person = class_type.new(params[:person])
于 2010-12-13T11:25:53.873 回答
1

除了在表单中添加类型选择的下拉列表之外,没有什么可做的了。您可以以正常方式创建用户,例如:

@user = Person.new params[:user]

但是type属性不能批量赋值,所以必须单独赋值。

@user.type = sanitize_user_type params[:user][:type]

该方法sanitize_user_type用于验证用户输入值。

创建新用户的路径不需要改变。其他路线是否需要更改取决于您的要求。实际上,您可以添加、和相关控制器的路由Teacher,以便您可以构建 restful url。StudentOutsider

于 2010-12-13T11:27:07.840 回答