2

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

设置

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


我想做的事

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


方式一

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


方式2(我宁愿这样做)

每个项目都有一个单独的视图,包含完整的文档。show根据函数中加载的项目加载特定视图


注释

自从我使用 CodeIgniter 以来,Rails 中是否有一些我不习惯考虑的第三种方式?

我完全可以适应“Rails Way”是什么,但我只是不确定这种事情的正确约定是什么。

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

提前致谢。

4

2 回答 2

1

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

这里有一个试穿尺寸的建议。

您可以将文档、代码示例等存储在 section 表中,或者将每种类型存储在其自己的表中。如果您将它们放在sections 表中,请包含一个类型字段,并为每种类型使用不同的类。假设 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

如果你想组织你的项目展示页面来包含这些部分,你可以为每个部分类型调用 partials。

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

resources :projects do
  resource :documentation
  resource :code_example
end

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

于 2012-04-26T12:43:49.103 回答
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”和带有模板名称“myspecialproject”的项目的“show_myspecialproject.html.erb”等......

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

如果您想使用 show.html.erb,您也可以使用部分模板,因为您有代码重复并保持模板 DRY。 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 %>

在此示例中,所有部分模板都应以 "_" 开头,例如。:“_myspecialproject.html.erb”

于 2012-04-26T08:24:13.577 回答