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

标签 ruby ruby-on-rails-3 routing sti

我在使用 Ruby on Rails 应用程序中的单表继承进行路由时遇到了一些问题。我正在使用 Ruby 1.9.2 和 Rails 3.0.6。这是在开发中,所以后端是 SQLite3,以防万一。

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

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

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

resources :bugs

namespace "widgets" do
  resources :bugs
end

namespace "sprockets" do
  resources :bugs
end

我已经设置了以下模型,当我启动 irb 并使用 WidgetBug.create()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

我使用脚手架为错误对象创建 Controller 和 View ,然后修改 Controller 以尝试对其进行概括,以便它可以与小部件错误和链轮错误一起使用。例如,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,所以当我调用它时,它似乎正在运行父类(super class)而不是针对子类运行。

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

最佳答案

查看这篇文章: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"

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

关于ruby - Ruby on Rails 3.0 中的单表继承和路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5720100/

相关文章:

ruby-on-rails - 如何处理 guest 用户的链接?

ruby-on-rails - 为什么 "render ' new'“改变我的 URL?(Ruby On Rails)

ruby-on-rails - 如何清理我的 join_table 并删除重复的条目?

ruby - ActiveRecord,通过多态属性查找

reactjs - 路径路由 : Application Load Balancer for React Application

sql - 如何排序和挑选 Rails 中的前几项

ruby-on-rails - 测试 View 助手 : how do I specify a controller?

asp.net-mvc - 如何将 "/img/"路由到 ASP.NET MVC 3 中的 "/Content/img"文件夹?

laravel - 我如何限制对任何路由的直接访问并抛出 404 异常,即使路由存在?

ruby - 在 Ruby 中将二进制值转换为十六进制