作为一个新手,我决定建立一个“家庭库存”应用程序。我现在仍然坚持如何在浏览器中查看时根据项目的类型以编程方式选择布局。
根据我的计划,到目前为止,我应该创建一些模型来表示我在家中可以找到的物品类型:家具,电子产品和图书
class Book < ActiveRecord::Base
end
class Furniture < ActiveRecord::Base
end
class Electronic < ActiveRecord::Base
end
现在,图书模型包含 isbn ,网页,地址和类别< / em>的。 家具模型包含颜色,价格,地址和类别等内容。 电子产品包含名称,电压,地址和类别等内容。
这是我困惑的地方。我知道属性地址对所有人来说都是一样的。我也知道,我需要为3种不同类型的项目创建多个“布局”,以使用适当的图形和样式表显示所述项目的不同属性。
但是我将如何决定项目的类别,以便确定要呈现的布局。
据我所知,这就是我要做的事情:
class DisplayController < ApplicationController
def display
@item = Params[:item]
if @item.category = "electronics"
render :layout => 'electronics'
end
end
在我的routes.rb
中map.display ':item', :controller => 'display', :action => 'display'
我似乎只对此有一个担忧,我可能会在以后添加很多类别,并认为应该有一种更干的方式来处理,而不是硬编码。
我知道我需要添加到我的布局html标签中以显示该特定类别的相关信息。
----的问题 ----
另外,我试图获得一个路由来呈现像“http://localhost/living-room-tv”
这样的网址答案 0 :(得分:1)
如果您有2-3个类别,这可能是正确的方法。如果您的系统将会增长,您肯定希望使实施更加灵活。
不确定您对搜索的期望是什么。我最好的选择是,在搜索结果页面上,您将拥有不同类型的项目,因此您只需要不同的部分来呈现它们。
正如我所说,使用您当前的方法添加对不同类别的支持可能会很乏味。我可以提出两件事(不一定是相互排斥的):
electronics
布局呈现)。通过这种方式,您只需render :layout => @item.category
,此代码就可以添加新的类别证明多态关联是另一回事。对于那些应该有两个模型,你目前只有一个。请参阅Rails Guides, 2.9。
顺便说一下,我不确定为什么你需要整个布局来区分不同的类别。如果您网站的整体外观是一致的,那么对于不同类别的项目,只有不同的部分可能更合适。
答案 1 :(得分:1)
如果我理解正确,你想要的不是不同的布局。你想要的是不同的模板。
布局是指整个页面的一般结构,它通常适用于整个项目,或者每个项目可能有2-3个布局。 (网站布局,管理布局和其他一些特定布局)。
你提到的是你想要一个不同的模板来展示书籍,家具和电子产品的不同属性。
创建一个视图文件app / views / display / furniture.html.erb和另一个用于书籍和电子产品,并使用render :template => 'furniture'
代替render :layout
进行渲染。
现在,如果不同类别之间存在共同的信息,您应该做的是创建仅包含公共部分的部分信息。例如,创建一个部分app / views / shared / address.html.erb,在您的furniture.html.erb中,您可以render :partial => '/shared/address', :locals => {:address => @item.address}
。
这将帮助您保持视图逻辑尽可能干燥,同时为您提供为每个类别创建自定义模板的灵活性。