Ruby on Rails 3.0中的单表继承和路由



在我的Ruby on Rails应用程序中,我遇到了一些麻烦,让路由很好地发挥单表继承。我使用Ruby 1.9.2和Rails 3.0.6。这是在开发中,所以后端是SQLite3,以防有什么不同。

假设我有两个生成物,widgetssprockets。我的应用程序跟踪两个产品的bug号和支持案例票,但是bug和支持票本身存储在其他系统中。有两个独立的团队在开发这两个产品。

我已经为这两种类型的错误记录实现了单表继承,因为小部件错误编号和链轮错误编号的验证规则是不同的(两个团队使用不同的错误跟踪系统),并且有可能我将不得不向应用程序添加更多行为完全不同的产品。使用STI使我能够灵活地根据需要实现其他方法和属性。

小部件团队只关心小部件信息,链轮团队只关心链轮信息。还有第三个团队需要能够查看小部件和链轮的信息。小部件团队将使用路径/widgets访问应用程序,链轮团队将使用路径/sprockets访问应用程序。我在routes.rb中使用名称空间设置了这一点:

resources :bugs
namespace "widgets" do
  resources :bugs
end
namespace "sprockets" do
  resources :bugs
end

我已经设置了以下模型,当我启动irb并使用WidgetBug.create()SprocketBug.create()时,这些模型按预期工作:

bug.rb

class Bug < ActiveRecord::Base
end

widget_bug.rb

class WidgetBug < Bug
  # Some validation rules
end

sprocket_bug.rb

class SprocketBug < Bug
  # Some different validation rules
end

我使用脚手架为bug对象创建控制器和视图,然后修改控制器以尝试将其一般化,以便它可以用于小部件错误和链轮错误。例如,index方法看起来像这样:

  def index
    # The scaffold code lists all bugs, which is not what we want
    # @bugs = Bug.all
    # Only return bugs of the subclass we're looking for
    @bugs = eval("#{params[:controller].classify}.all")
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @bugs }
    end
  end
然后,我使用create()用每种类型的几个错误填充数据库。不幸的是,当我浏览到/widgets/bugs时,两个产品的错误都出现了。经过一些调试,我确定分类调用返回Widgets::BugsSprockets::Bugs,所以当我对它调用all时,它似乎是针对超类运行,而不是针对子类运行。

我已经审查了路由文档,并在谷歌上进行了相当多的搜索,但我仍然不知道如何更改路由或控制器以使其正确工作。

查看此帖子:STI, one controller

路线

resources :widgets, :controller => "bugs", :type => "Widget"
resources :sprockets, :controller => "bugs", :type => "Sprocket"
# And I don't know if you need this
resources :bugs, :type => "Bug"
控制器

def index
  @bugs = params[:type].constantize.all
end

乌利希期刊指南

namespace "widgets" do
  resources :bugs, :type => "Widget"
end
namespace "sprockets" do
  resources :bugs, :type => "Sprocket"
end

我写了一篇关于Rails 3中的STI的博客文章,其中讨论了一些常见的陷阱和适当的解决方法,包括您提到的问题。http://www.christopherbloom.com/2012/02/01/notes-on-sti-in-rails-3-0/

相关内容

  • 没有找到相关文章

最新更新