什么是"铁路"加载模板页面

时间:2012-04-26 08:05:53

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我刚开始接受Ruby on Rails。我很喜欢它,但我遇到了障碍。我知道解决问题的两种方法,但我很好奇“Rails方式”是做什么的。

设置

我有一个列出项目描述的索引页面。当用户点击项目时,它会将它们带到项目控制器的show功能。列表中的项目是从MySQL数据库加载的。


我想做什么

我希望能够在每个“项目页面”上加载项目特定信息。此信息包含文档,代码示例等。每个页面都具有相同的通用模板。


方式1

将HTML和文本存储在MySQL数据库的“Sections”表中,并加载与该项目相关的所有部分。显示页面下方的每个部分。


方式2 (我宁愿这样做的方式)

使用完整文档为每个项目创建单独的视图。根据{{​​1}}函数

中加载的项目加载特定视图


注释

在Rails中是否有一些我不习惯的第三种方式,因为我来自使用CodeIgniter?

我完全愿意适应“Rails Way”的内容,但我不确定这种事情的正确惯例是什么。

或者这个问题是一个例子,你怎么做都没关系?

提前致谢。

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,其中一种最简单的方法是覆盖默认模板。(render:action不会在仅目标操作模板中运行任何代码) 这是你问题中的Way2。例如:

def show
  @project = Project.find(params[:id])
  if @project.has_template?
    render :action => "show_#{@project.template_name}" and return
  end
  render :action => "show"
end 

在此示例目录中,app / views / projects应包含每个项目的模板 名称如" show.html.erb"默认为1和" show_myspecialproject.html.erb" for template with template_name" myspecialproject"等等......

Template_name是一个告诉你项目是否有这样或者应该使用默认的方法,你可以在这个方法中加入任何逻辑,它可以是附加列id表或者只是template_name可以等于项目名,或者它可以只检查如果文件存在于当前目录中。

如果您想使用show.html.erb,也可以使用部分模板,因为您有代码重复并保持模板干燥。 http://rails.rubyonrails.org/classes/ActionView/Partials.html 这样

控制器操作是默认的

def show
    @project = Project.find(params[:id])      
end 



in show.html.erb
<h1><%= @project.name %></h1>
<%= render @project.tamplate_name %>

在此示例中,所有部分模板都应以&#34; _&#34;开头。 , 防爆。 :&#34; _myspecialproject.html.erb&#34;

答案 1 :(得分:1)

如果每个项目都有相同的通用模板,我不知道具有不同视图的价值是什么。

这是建议尝试尺寸。

您可以将文档,代码示例等存储在section表中,也可以将每种类型存储在自己的表中。如果在section表中包含它们,请包含类型字段,并为每种类型使用不同的类。假设Documentation和CodeExample是两个这样的类。

使用:conditions选项为每个类型在Project类中定义一个has_one。

class Project < ActiveRecord::Base
  has_one :documentation, :conditions => { :type => "Documentation" }
  has_one :code_example, :conditions => { :type => "CodeExample" }
end

class Documentation < ActiveRecord::Base
  set_table_name "sections"
  belongs_to :project
end

如果要整理项目展示页面以包含各个部分,可以为每个部分类型调用部分内容。

如果您希望项目展示页面有链接或标签(您可以使用链接或CSS格式化按钮在页面上实现标签),请转到控制器中的节目动作以显示节类型。使用嵌套路由可能是您想要使用的想法。

resources :projects do
  resource :documentation
  resource :code_example
end

这些是一些想法。如果你不想这样做,你可以从我的想法中得到你想要的东西。