Ruby on Rails中的欢迎页面/主页-最佳实践


80

我的主页(或欢迎页面)将包含来自两个模型的数据(分别称为作者和帖子)。我是Rails的新手,不确定要实现此目标的最佳方法是什么。

我是否应该创建一个名为welcome的新控制器,该控制器从作者和帖子中收集数据,然后在welcome index视图中显示它们?还是应该在帖子模型下获得欢迎的观点,该观点也可以从作者那里获取数据?或任何其他方式来做到这一点?

我了解如何从技术上做到所有这些,但是只是不确定使用Rails框架的最佳实践方法是什么。

Answers:


51

问题是,您的主页只是一个登录页面,还是一组页面?如果这只是一个登陆页面,那么您不希望用户在此停留很长时间,除非去其他地方。如果是一组页面,或者与现有页面相似,则可以向其最喜欢的控制器添加操作。

对于当前项目,我要做的是创建一个名为的控制器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

假设您正确定义了模型关系,那么匹配它的模板将非常简单。

祝你好运,希望这会有帮助。


因此,即使这种代码可能已经出现在控制器的动作中,在这种新的控制器/动作中编写@posts = Posts.find( ...@posts = Posts.all类似内容也不会被认为违反DRY的原理?有没有更好的(更模块化的)方式,该方式使用控制器的操作已编写的代码?PostindexPostindex
LazerSharks'1

127

似乎没有一个最佳实践。

(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#aboutpages#contactpages#termspages#privacy,等。

(3)Ruby on Rails的教程,去与static_pages#homestatic_pages#help等等,虽然我不喜欢这样表示控制器“静态”的想法。这些页面仍然可能具有一些动态方面,尤其是首页!

(4)尽管未讨论如何处理首页但半静态页面上的RailsCast#117建议使用另一组方法来仅显示资源。

我觉得偏爱1和/或2。使用“和”方案,您可以使用welcome#index和pages#about等,而使用“或”方案,则可以使用pages#home,pages#about,等等。如果被迫选择,我会选择选项2,因为您最终得到的代码更少。而且顺便说一句,2和3几乎相同,除了单词“ static”。


12
好的答案,我将选择2)pages#home。
Neeraj 2013年

3
恕我直言,@ user664833的答案应该被接受。表达明确研究和考虑的逻辑。
Betjamin Richards 2014年

29

刚开始使用Rails时,我问过自己类似的问题。这是您需要了解的内容:

  • 模型不一定与控制器和视图直接相关。

也就是说,特定的控制器/视图组合可以与生成该特定页面所需的任意多个模型一起使用。

控制器的目的是准备需要显示的数据集,而与使用哪种模型存储该数据无关。

视图的目的是然后以最适当的方式显示该数据。

换句话说,控制器/视图组合永远不会在特定模型下。他们使用模型,但不在任何层次关系中。实际上,它们是所使用任何模型的同伴

我认为混淆来自于AWDR和其他介绍性文本中找到的脚手架生成器示例,例如:

红宝石脚本/生成支架模型控制器

我知道模型与控制器/视图之间的这种隐含关系使我有些困惑。但是,确实没有严格的关系。如果有的话,那么使用MVC方法做任何复杂的事情将非常困难。显然,事实并非如此。

希望这可以帮助。

- 约翰


10
您对这个问题的回答是什么?
Mark Wilden

与其与其他答案(与提问者提出的问题直接相关)竞争,不如说是约翰对提问者具有的误解。这很有用。约翰没有理由重复别人所说的话,以解决他们没有解决的问题的一个方面。
iconoclast

11

最佳做法是您的第一个建议。创建一个“欢迎”控制器,并从所需的任何模型调用记录。有一个到该控制器的根路由点。非常干净和适当。


9

请注意,在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

1
它不是“欢迎”控制器还是单个资源,请使用show动作。
dangerousdave

9

这个答案从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'
Anconia

6

尽可能命名一个新的控制器。SummaryController?StartController?DailyFrontPageController?你会有一个主意。

不仅如此,我会认真考虑创建一个新的模型,而不是基于ActiveRecord的模型,该模型从您的Author和Post模型(或其真实名称)中收集信息,以供您查看。另一种方法是在控制器中组装数据,这几乎肯定是一团糟-每次我都尝试过,而且我尝试了很多次。单独的模型看起来要整洁一些。

如果处理相对简单,为什么不先尝试在控制器中构建数据,然后将输出包装在Struct中,然后用真实的类替换Struct,然后将结构移到那里,一直进行重构。它不应该增加总时间(大多数代码可以重复使用),并且您将对最适合自己的东西有个好主意。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.