Ion*_*eek 4 ruby routing sti ruby-on-rails-3
我在使用 Ruby on Rails 应用程序中的单表继承时遇到了一些问题。我使用的是 Ruby 1.9.2 和 Rails 3.0.6。这是在开发中,所以后端是 SQLite3,以防万一。
假设我有两个产品,widgets和sprockets. 我的应用程序跟踪两个产品的错误编号和支持案例票,但错误和支持票本身存储在其他系统中。有两个独立的团队负责这两种产品。
我已经为两种类型的错误记录实现了单表继承,因为小部件错误号和链轮错误号的验证规则不同(两个团队使用不同的错误跟踪系统),并且有可能我将不得不添加更多产品到行为截然不同的应用程序。使用 STI 使我可以根据需要灵活地实现其他方法和属性。
小部件团队只关心小部件信息,链轮团队只关心链轮信息。第三个团队需要能够查看小部件和链轮上的信息。小部件团队将使用路径访问应用程序/widgets,链轮团队将使用路径访问应用程序/sprockets。我在routes.rb使用命名空间中进行了设置:
resources :bugs
namespace "widgets" do
resources :bugs
end
namespace "sprockets" do
resources :bugs
end
Run Code Online (Sandbox Code Playgroud)
我已经设置了以下模型,当我启动 irb 并使用WidgetBug.create()or时,它们按预期工作SprocketBug.create():
错误文件
class Bug < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
widget_bug.rb
class WidgetBug < Bug
# Some validation rules
end
Run Code Online (Sandbox Code Playgroud)
sprocket_bug.rb
class SprocketBug < Bug
# Some different validation rules
end
Run Code Online (Sandbox Code Playgroud)
我使用脚手架来创建控制器和 bug 对象的视图,然后修改控制器以尝试对其进行概括,以便它可以与小部件 bug 和链轮 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
Run Code Online (Sandbox Code Playgroud)
然后我用create()每种类型的几个错误填充数据库。不幸的是,当我浏览到 时/widgets/bugs,两种产品的错误都会出现。经过一些调试,我确定分类调用正在返回Widgets::Bugsor Sprockets::Bugs,所以当我调用 all 时,它似乎是针对超类运行,而不是针对子类运行。
我已经查看了路由文档并在 Google 上进行了大量搜索,但我仍然不知道如何更改路由或控制器以使其正常工作。任何帮助将不胜感激。
查看这篇文章:STI,一个控制器
路线
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"
Run Code Online (Sandbox Code Playgroud)
控制器
def index
@bugs = params[:type].constantize.all
end
Run Code Online (Sandbox Code Playgroud)
UPD
namespace "widgets" do
resources :bugs, :type => "Widget"
end
namespace "sprockets" do
resources :bugs, :type => "Sprocket"
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3901 次 |
| 最近记录: |