【问题标题】:Multiple layouts in rails [Newbie Q]rails中的多种布局[新手Q]
【发布时间】:2011-03-03 19:31:13
【问题描述】:

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

根据我的计划,到目前为止,我应该已经创建了几个模型来代表我在家中可以找到的物品类型:家具、电子产品和书籍。

class Book < ActiveRecord::Base
end

class Furniture < ActiveRecord::Base
end

class Electronic < ActiveRecord::Base
end

现在 Books 模型具有 isbn、pages、address 和 category。 Furniture 模型具有 color、price、address 和 category 等内容。 Electronics 有 name、voltage、address 和 category 等内容。 p>

这就是我感到困惑的地方。我知道属性 address 对他们所有人来说都是一样的。我也知道,我需要为 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'

我似乎只关心这一点,我以后可能会添加很多类别,并认为应该有一种更 DRY 式的处理方式,而不是硬编码。

我了解我需要在布局中添加 html 标记以显示该特定类别的相关信息。

----问题----

  1. 这是解决此类问题的正确方法吗?
  2. 当我决定添加像 thinking_sphinx 这样的 gem 来运行搜索时,这种方法是否兼容。
  3. 您认为我的方法存在哪些问题以及如何改进。
  4. 我正在阅读有关“多态关联”的内容,这是否适用于这种情况,因为所有项目都存在类别?

另外,我试图获取一个路由来呈现像“http://localhost/living-room-tv”这样的 URL

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    如果我理解正确,您想要的不是不同的布局。你想要的是不同的模板。

    布局是指整个页面的总体结构,通常是整个项目通用的,或者每个项目可能有2-3个布局。 (站点范围的布局、管理布局和其他一些特定布局)。

    您提到的是您想要一个不同的模板来显示书籍、家具和电子产品的不同属性。

    为书籍和电子产品创建一个视图文件 app/views/display/furniture.html.erb 和另一个,并使用 render :template =&gt; 'furniture' 而不是 render :layout 呈现它。

    现在,如果不同类别之间有共同的信息,您应该做的是创建一个仅包含共同部分的部分。例如,创建一个部分 app/views/shared/address.html.erb,然后在您的家具.html.erb 中执行render :partial =&gt; '/shared/address', :locals =&gt; {:address =&gt; @item.address}。

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

    【讨论】:

    • 是的,先生。这确实是我的想法。我明白我现在需要做什么。我希望你不介意我寻求帮助,以防我再次陷入困境。在那之前,我将尝试以“模板”的方式实现它。再次感谢!
    • 这就是堆栈溢出的用途..随时问
    【解决方案2】:
    1. 如果您有 2-3 个类别,这可能是正确的方法。如果您的系统要发展壮大,您肯定希望实现更加灵活。

    2. 不确定您对搜索的预期问题。我最好的选择是,在搜索结果页面上你会有不同种类的项目,所以你只需要不同的部分来呈现它们。

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

      • 使用约定将类别名称与布局相关联(例如,类别“电子”通过electronics 布局呈现)。这样你就可以render :layout =&gt; @item.category,并且这段代码正在添加新类别证明
      • 随着系统的发展和增强,您可能会发现有必要为您的类别引入全新的模型。现在想想,也许你现在就想这样做。
    4. 多态关联是另一回事。应该有两种型号,您目前只有一种。请参阅Rails Guides, 2.9。

    顺便说一句,我不确定为什么您需要整个布局因类别而异。如果您网站的整体外观是一致的,那么为不同类别的项目设置不同的部分可能更合适。

    关于网址,这个问题已被多次提出(here 和 there)。

    【讨论】:

    • 对于我读到的关于 Partials 的所有内容,我完全忘记了这一点。视图部分的部分和类别模型,我假设我必须将其作为 has_one :category 然后从那里开始。同时我会尝试,如果需要,我会寻求进一步的帮助。谢谢中微子!
    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多