5

我已经为一个人类实现了单表继承

class Person < ActiveRecord::Base

end


class Teacher < Person

end

class Student < Person

end

class Outsider < Person

end

并且 create person 似乎根据在 form.select 中选择的内容创建了 Teacher、Student 或 Person,并添加了 type 属性。

但是,我似乎打破了路线

<%= link_to '编辑', edit_person_path(@deal) %> | <%= link_to '返回', people_path %>

他们似乎指向teacher_path、student_path 和outsider_path 而不是person_path。

路线需要做哪些改变?

4

2 回答 2

2

首先为您的模型生成控制器...

rails generate controller Persons
rails generate controller Teachers
rails generate controller Students
rails generate controller Outsiders

然后在 routes.rb (rails 3)

resources :persons
resources :teachers
resources :students
resources :outsiders

为您提供 REST 路由

例如

persons GET    /persons(.:format) {:action=>"index", :controller=>"persons"}
new_person GET    /person/new(.:format) {:action=>"new", :controller=>"persons"}
edit_person GET    /persons/:id/edit(.:format) {:action=>"edit", :controller=>"persons"}
person GET    /persons/:id(.:format) {:action=>"show", :controller=>"persons"} 
persons POST   /spersons(.:format) {:action=>"create", :controller=>"persons"}    
person PUT    /persons/:id(.:format) {:action=>"update", :controller=>"persons"}    
person DELETE /persons/:id(.:format) {:action=>"destroy", :controller=>"persons"}

老师、学生、外人都一样

检查 rake 路线或 rake 路线 | grep 老师

于 2010-12-13T20:17:44.027 回答
1

根据我的经验,最好对所有 STI 型号使用单个控制器。如果您要保持控制器干燥,则不需要为每个子类设置唯一的控制器逻辑。将所有内容保留在模型中。

resources :people

您命名的路线将如下所示:

people_path
new_person
edit_person
person
etc...

然后您可以使用相同的控制器/视图来管理这些模型。如果您稍后决定添加新的 Person STI 模型,则无需对代码进行任何重大更新。

于 2010-12-13T23:58:43.623 回答