如何使用单表继承(STI)为Ruby on Rails中的继承资源生成适当的路由帮助程序



我有两个资源:FaxRequest和InternetRequest,它们都继承自Request。我使用rails scaffold resource命令生成了这三个资源中的每一个,然后修改了模型以继承Request,如下所示:

#request.rb
class Request < ActiveRecord::Base
end
#fax_request.rb
class FaxRequest < Request
end
#internet_request.rb
class InternetRequest < Request
end

我想有一个视图,有一个表显示所有的请求(包括传真请求和internet请求)在一起。我已经将其实现为Request控制器的索引视图。

#request_controller.rb
def index
  @requests = Request.all
end

#views/requests/index.html.haml
=@requests.each do |request|
  = request.date
  = link_to('show', request)
  = link_to('edit', ?)
  = link_to('delete' ?)

我看到link_to('view', request)是聪明的足以生成链接到适当的资源,但 Rails如何知道是否生成edit_fax_request_path(request)edit_internet_request_path(request) 基于请求的子类?新建和删除也一样?

其次,我很想知道STI的惯用方法是什么。一个控制器还是三个?我是不是把这个问题想错了?在我看来,Rails将有一个整洁的方式来处理这个问题,但我已经谷歌,找不到任何东西。也许我没问对问题?

您所需要做的就是为编辑链接使用edit_request_path(request)助手方法。至于删除链接,这里是删除链接代码,脚手架将生成并将工作,一旦你做了我下面概述:

= link_to( 'Destroy', request, :confirm => 'Are you sure?', :method => :delete )

然后编辑您的路由文件,告诉rails生成到request控制器的适当路由,如下所示(注意,您可能不需要map部分):

map.resources :requests
map.resources :fax_requests, :controller => :requests
map.resources :internet_requests, :controller => :requests

这样,所有的路由都像你期望的那样生成,它们都到它们继承的主控制器。

更新:找到一篇很棒的文章谈论这个(并警告我说的一些)

http://code.alexreisner.com/articles/single-table-inheritance-in-rails.htmlhttp://stackoverflow.com/questions/4507149/best-practices-to-handle-routes-for-sti-subclasses-in-rails

最新更新