导轨中的多种布局[新手Q]

时间:2010-06-15 03:47:50

标签: ruby-on-rails

作为一个新手,我决定建立一个“家庭库存”应用程序。我现在仍然坚持如何在浏览器中查看时根据项目的类型以编程方式选择布局。

根据我的计划,到目前为止,我应该创建一些模型来表示我在家中可以找到的物品类型:家具电子产品图书

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标签中以显示该特定类别的相关信息。

----的问题 ----

  1. 这是解决此类问题的正确方法。
  2. 当我决定添加像 thinking_sphinx 这样的宝石来运行搜索时,这种方法是否兼容。
  3. 您对我的方法有什么看法,如何让它变得更好。
  4. 我正在读一些关于“变形协会”的内容,这是否适用于这种情况,因为所有项目都存在类别?
  5. 另外,我试图获得一个路由来呈现像“http://localhost/living-room-tv

    这样的网址

2 个答案:

答案 0 :(得分:1)

  1. 如果您有2-3个类别,这可能是正确的方法。如果您的系统将会增长,您肯定希望使实施更加灵活。

  2. 不确定您对搜索的期望是什么。我最好的选择是,在搜索结果页面上,您将拥有不同类型的项目,因此您只需要不同的部分来呈现它们。

  3. 正如我所说,使用您当前的方法添加对不同类别的支持可能会很乏味。我可以提出两件事(不一定是相互排斥的):

    • 使用约定将类别名称与布局相关联(例如,类别“电子”通过electronics布局呈现)。通过这种方式,您只需render :layout => @item.category,此代码就可以添加新的类别证明
    • 随着您的系统不断发展壮大,您可能会发现有必要为您的类别引入全新的模型。现在想想,也许你现在想要这样做。
  4. 多态关联是另一回事。对于那些应该有两个模型,你目前只有一个。请参阅Rails Guides, 2.9

  5. 顺便说一下,我不确定为什么你需要整个布局来区分不同的类别。如果您网站的整体外观是一致的,那么对于不同类别的项目,只有不同的部分可能更合适。

    关于网址,此问题已多次提出(herethere)。

答案 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}

这将帮助您保持视图逻辑尽可能干燥,同时为您提供为每个类别创建自定义模板的灵活性。