4

在我的 Ruby on Rails 应用程序中,让路由与单表继承很好地配合使用时遇到了一些麻烦。我正在使用 Ruby 1.9.2 和 Rails 3.0.6。这是在开发中,所以后端是 SQLite3,以防万一。

假设我有两种产品,widgets并且sprockets. 我的应用程序会跟踪这两种产品的错误编号和支持案例票,但错误和支持票本身存储在其他系统中。有两个独立的团队负责这两种产品。

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

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

resources :bugs

namespace "widgets" do
  resources :bugs
end

namespace "sprockets" do
  resources :bugs
end

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

错误.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

我使用脚手架为错误对象创建控制器和视图,然后修改控制器以尝试对其进行概括,以便它可以用于小部件错误和 sprockets 错误。例如,该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::Bugsor Sprockets::Bugs,所以当我调用它时,它似乎是针对超类运行而不是针对子类运行。

我已经查看了路由文档并在 Google 上进行了大量搜索,但我仍然不知道如何更改路由或控制器以使其正常工作。任何帮助将不胜感激。

4

2 回答 2

5

Checkout this post: STI, one controller

Routes

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"

Controller

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

UPD

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

namespace "sprockets" do
  resources :bugs, :type => "Sprocket"
end
于 2011-04-19T19:12:51.847 回答
-1

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

于 2013-04-26T03:09:11.173 回答