我刚开始接受Ruby on Rails。我很喜欢它,但我遇到了障碍。我知道解决问题的两种方法,但我很好奇“Rails方式”是做什么的。
设置
我有一个列出项目描述的索引页面。当用户点击项目时,它会将它们带到项目控制器的show
功能。列表中的项目是从MySQL数据库加载的。
我想做什么
我希望能够在每个“项目页面”上加载项目特定信息。此信息包含文档,代码示例等。每个页面都具有相同的通用模板。
方式1
将HTML和文本存储在MySQL数据库的“Sections”表中,并加载与该项目相关的所有部分。显示页面下方的每个部分。
方式2 (我宁愿这样做的方式)
使用完整文档为每个项目创建单独的视图。根据{{1}}函数
中加载的项目加载特定视图
的注释
在Rails中是否有一些我不习惯的第三种方式,因为我来自使用CodeIgniter?
我完全愿意适应“Rails Way”的内容,但我不确定这种事情的正确惯例是什么。
或者这个问题是一个例子,你怎么做都没关系?
提前致谢。
答案 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
这些是一些想法。如果你不想这样做,你可以从我的想法中得到你想要的东西。