我对rails很陌生,我有点被这个设计问题困住了,这个问题可能很容易解决,但我什么也不懂:我有两种不同类型的广告:高光广告和特价广告。两者都有相同的属性:标题,描述和一个图像(与回形针)。他们也有同样的行动应用于他们:索引,新,编辑,创建,更新和破坏。
我设置了这样的STI:
Ad模型: ad.rb
class Ad < ActiveRecord::Base
end交易模型: bargain.rb
class Bargain < Ad
end亮点模型: highlight.rb
class Highlight < Ad
end问题是我只想有一个控制器(AdsController)来执行我根据网址对便宜货或高光说的操作,比如www.foo.com/便宜货/.或www.foo.com/要闻/。
例如:
我怎么能这么做?
谢谢!
发布于 2011-03-09 21:03:55
第一。增加一些新的路线:
resources :highlights, :controller => "ads", :type => "Highlight"
resources :bargains, :controller => "ads", :type => "Bargain"并在AdsController中修复一些操作。例如:
def new
@ad = Ad.new()
@ad.type = params[:type]
end所有这些控制器作业的最佳方法的看起来都是 这句话
就这样。现在您可以转到localhost:3000/highlights/new,新的Highlight将被初始化。
索引操作可以如下所示:
def index
@ads = Ad.where(:type => params[:type])
end转到localhost:3000/highlights,高亮的列表就会出现。
同样的讨价还价方式:localhost:3000/bargains
等
URLS
<%= link_to 'index', :highlights %>
<%= link_to 'new', [:new, :highlight] %>
<%= link_to 'edit', [:edit, @ad] %>
<%= link_to 'destroy', @ad, :method => :delete %>多态:)
<%= link_to 'index', @ad.class %>发布于 2011-03-10 03:07:07
fl00r有一个很好的解决方案,但是我会做一个调整。
在您的情况下,这可能需要也可能不需要。这取决于STI模型中的行为变化,特别是验证和生命周期挂钩。
向控制器中添加一个私有方法,将类型param转换为要使用的实际类常量:
def ad_type
params[:type].constantize
end然而,上述情况是不安全的。添加类型的白名单:
def ad_types
[MyType, MyType2]
end
def ad_type
params[:type].constantize if params[:type].in? ad_types
end更多关于rails的Constan化方法,在这里:http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-constantize
然后,在控制器操作中可以这样做:
def new
ad_type.new
end
def create
ad_type.new(params)
# ...
end
def index
ad_type.all
end现在,您使用的是具有正确行为的实际类,而不是具有属性类型集的父类。
发布于 2011-03-26 17:01:21
我只想包括这个链接,因为有许多有趣的技巧都与这个主题相关。
Alex Rails中的单表继承
https://stackoverflow.com/questions/5246767
复制相似问题