首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STI,一个控制器

STI,一个控制器
EN

Stack Overflow用户
提问于 2011-03-09 13:54:06
回答 5查看 18.1K关注 0票数 60

我对rails很陌生,我有点被这个设计问题困住了,这个问题可能很容易解决,但我什么也不懂:我有两种不同类型的广告:高光广告和特价广告。两者都有相同的属性:标题,描述和一个图像(与回形针)。他们也有同样的行动应用于他们:索引,新,编辑,创建,更新和破坏。

我设置了这样的STI:

Ad模型: ad.rb

代码语言:javascript
复制
class Ad < ActiveRecord::Base
end

交易模型: bargain.rb

代码语言:javascript
复制
class Bargain < Ad
end

亮点模型: highlight.rb

代码语言:javascript
复制
class Highlight < Ad
end

问题是我只想有一个控制器(AdsController)来执行我根据网址对便宜货或高光说的操作,比如www.foo.com/便宜货/.或www.foo.com/要闻/。

例如:

  • 获取www.foo.com/要闻=>,列出所有重点广告。
  • 获取www.foo.com/要闻/新的=>表单来创建一个新的突出显示等等.

我怎么能这么做?

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-09 21:03:55

第一。增加一些新的路线:

代码语言:javascript
复制
resources :highlights, :controller => "ads", :type => "Highlight"
resources :bargains, :controller => "ads", :type => "Bargain"

并在AdsController中修复一些操作。例如:

代码语言:javascript
复制
def new
  @ad = Ad.new()
  @ad.type = params[:type]
end

所有这些控制器作业的最佳方法的看起来都是 这句话

就这样。现在您可以转到localhost:3000/highlights/new,新的Highlight将被初始化。

索引操作可以如下所示:

代码语言:javascript
复制
def index
  @ads = Ad.where(:type => params[:type])
end

转到localhost:3000/highlights,高亮的列表就会出现。

同样的讨价还价方式:localhost:3000/bargains

URLS

代码语言:javascript
复制
<%= link_to 'index', :highlights %>
<%= link_to 'new', [:new, :highlight] %>
<%= link_to 'edit', [:edit, @ad] %>
<%= link_to 'destroy', @ad, :method => :delete %>

多态:)

代码语言:javascript
复制
<%= link_to 'index', @ad.class %>
票数 108
EN

Stack Overflow用户

发布于 2011-03-10 03:07:07

fl00r有一个很好的解决方案,但是我会做一个调整。

在您的情况下,这可能需要也可能不需要。这取决于STI模型中的行为变化,特别是验证和生命周期挂钩。

向控制器中添加一个私有方法,将类型param转换为要使用的实际类常量:

代码语言:javascript
复制
def ad_type
  params[:type].constantize
end

然而,上述情况是不安全的。添加类型的白名单:

代码语言:javascript
复制
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

然后,在控制器操作中可以这样做:

代码语言:javascript
复制
def new
  ad_type.new
end

def create
  ad_type.new(params)
  # ...
end

def index
  ad_type.all
end

现在,您使用的是具有正确行为的实际类,而不是具有属性类型集的父类。

票数 65
EN

Stack Overflow用户

发布于 2011-03-26 17:01:21

我只想包括这个链接,因为有许多有趣的技巧都与这个主题相关。

Alex Rails中的单表继承

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5246767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档