我的主页(或欢迎页面)将包含来自两个模型的数据(分别称为作者和帖子)。我是Rails的新手,不确定要实现此目标的最佳方法是什么。
我是否应该创建一个名为welcome的新控制器,该控制器从作者和帖子中收集数据,然后在welcome index视图中显示它们?还是应该在帖子模型下获得欢迎的观点,该观点也可以从作者那里获取数据?或任何其他方式来做到这一点?
我了解如何从技术上做到所有这些,但是只是不确定使用Rails框架的最佳实践方法是什么。
Answers:
问题是,您的主页只是一个登录页面,还是一组页面?如果这只是一个登陆页面,那么您不希望用户在此停留很长时间,除非去其他地方。如果是一组页面,或者与现有页面相似,则可以向其最喜欢的控制器添加操作。
对于当前项目,我要做的是创建一个名为的控制器Static
,因为我需要3个静态页面。主页就是其中之一,因为除了其他地方,没有其他可看或要做的事情。
要映射默认路由,请在中使用以下命令routes.rb
:
# Place at the end of the routing!
map.root :controller => 'MyController', :action => :index
就我而言,这将是:
map.root :controller => 'static', :action => :index
如果愿意,可以为此主页创建一个控制器。我称它为main,或者您可以记住的与主页相关的东西。从那里您可以获取数据和模型,并遵循输出视图。
class MainController < ApplicationController
def index
@posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user)
end
end
假设您正确定义了模型关系,那么匹配它的模板将非常简单。
祝你好运,希望这会有帮助。
似乎没有一个最佳实践。
(1)标准config/routes.rb
文件似乎建议根页面(或主页/欢迎页面)应由处理welcome#index
。如果要以此为指导,则welcome#index
可以使用以下命令生成相应的控制器/动作:
rails generate controller Welcome index
然后,在中config/routes.rb
,您可以删除get "welcome/index"
由生成器自动添加的GET路由(),并将根路由root 'welcome#index'
(或放置root :to => 'welcome#index'
在Rails中< 4
)放在文件的顶部,因为它可能是您最受欢迎的路由,应该首先进行匹配。
还记得public/index.html
在Rails中删除< 4
。
(2)的官方Ruby on Rails的路径向导的用途PagesController
。它实际上表明pages#main
,尽管对我而言,它更有意义pages#home
(因为“主页”是无处不在的术语/概念)。此外,该控制器可以处理其他面向页面的动作,如pages#about
,pages#contact
,pages#terms
,pages#privacy
,等。
(3)的Ruby on Rails的教程,去与static_pages#home
和static_pages#help
等等,虽然我不喜欢这样表示控制器“静态”的想法。这些页面仍然可能具有一些动态方面,尤其是首页!
(4)尽管未讨论如何处理首页,但半静态页面上的RailsCast#117建议使用另一组方法来仅显示资源。
我觉得偏爱1和/或2。使用“和”方案,您可以使用welcome#index和pages#about等,而使用“或”方案,则可以使用pages#home,pages#about,等等。如果被迫选择,我会选择选项2,因为您最终得到的代码更少。而且顺便说一句,2和3几乎相同,除了单词“ static”。
刚开始使用Rails时,我问过自己类似的问题。这是您需要了解的内容:
也就是说,特定的控制器/视图组合可以与生成该特定页面所需的任意多个模型一起使用。
控制器的目的是准备需要显示的数据集,而与使用哪种模型存储该数据无关。
视图的目的是然后以最适当的方式显示该数据。
换句话说,控制器/视图组合永远不会在特定模型下。他们使用模型,但不在任何层次关系中。实际上,它们是所使用任何模型的同伴。
我认为混淆来自于AWDR和其他介绍性文本中找到的脚手架生成器示例,例如:
红宝石脚本/生成支架模型控制器
我知道模型与控制器/视图之间的这种隐含关系使我有些困惑。但是,确实没有严格的关系。如果有的话,那么使用MVC方法做任何复杂的事情将非常困难。显然,事实并非如此。
希望这可以帮助。
- 约翰
最佳做法是您的第一个建议。创建一个“欢迎”控制器,并从所需的任何模型调用记录。有一个到该控制器的根路由点。非常干净和适当。
请注意,在Rails3中,解决此问题的正确方法是在route.rb文件的末尾添加以下行:
root :to => "welcome#index"
并删除public / index.html.erb。
还请注意,welcome#index对应于WelcomeController中的索引动作,来自The Wicked Flea的答案的代码如下所示:
class WelcomeController < ApplicationController
def index
@posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user)
end
end
这个答案从Rails 3.2.1开始。
首先为页面设置一个Controller,例如static
:
$ rails generate controller static
在文件中app/controllers/static_controller.rb
:
class StaticController < ApplicationController
def index
end
end
创建新的视图文件 app/views/index.html.erb
最后配置您的config/routes.rb
:
MyApp::Application.routes.draw do
match 'home', :to => "static#index"
root :to => "static#index"
end
这将使两者都进行,/home
然后/
转到您刚创建的View文件中放置的内容。
match 'home' => 'static#index'
尽可能命名一个新的控制器。SummaryController?StartController?DailyFrontPageController?你会有一个主意。
不仅如此,我会认真考虑创建一个新的模型,而不是基于ActiveRecord的模型,该模型从您的Author和Post模型(或其真实名称)中收集信息,以供您查看。另一种方法是在控制器中组装数据,这几乎肯定是一团糟-每次我都尝试过,而且我尝试了很多次。单独的模型看起来要整洁一些。
如果处理相对简单,为什么不先尝试在控制器中构建数据,然后将输出包装在Struct中,然后用真实的类替换Struct,然后将结构移到那里,一直进行重构。它不应该增加总时间(大多数代码可以重复使用),并且您将对最适合自己的东西有个好主意。
@posts = Posts.find( ...
或@posts = Posts.all
类似内容也不会被认为违反DRY的原理?有没有更好的(更模块化的)方式,该方式使用控制器的操作已编写的代码?Post
index
Post
index