欢迎/ Ruby on Rails主页 – 最佳实践
我的主页(或欢迎页面)将由两个模型的数据组成(让我们称它们为作者和post)。 我是新来的铁轨,不知道什么是最好的方式来实现这一目标。
我应该创build一个名为welcome的新控制器,它从作者和post收集数据,然后将其显示在欢迎索引视图中? 或者我应该有一个受欢迎的观点下的模型,也从作者的数据? 或者任何其他方式来完成这个?
我明白如何在技术上做到这一点,但只是不确定使用rails框架的最佳实践方法是什么。
问题是,你的主页只是一个登陆页面,或将它是一组页面? 如果这只是一个登陆页面,你不会指望你的用户长时间呆在那里,除非去其他地方。 如果它是一组页面,或与现有组类似,则可以将操作添加到控制器中。
我为我当前的项目所做的是使一个名为Static
的控制器,因为我需要3个静态页面。 主页是其中之一,因为除了去其他地方之外,没有什么可以看到或做的。
要映射默认路由,请在routes.rb
使用以下routes.rb
:
# Place at the end of the routing! map.root :controller => 'MyController', :action => :index
在我的情况下,这将是:
map.root :controller => 'static', :action => :index
如果你愿意的话,你可以为这个主页创build一个控制器。 我会把它称为主要的,或者你可以记住的与主页相关的东西。 从那里你可以得到你的数据和你的模型,并推迟到输出视图。
class MainController < ApplicationController def index @posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user) end end
假设你有正确的模型关系定义,匹配它的模板将是非常简单的。
祝你好运,希望这会有帮助。
似乎没有一个最好的做法。
(1)标准的config/routes.rb
文件似乎build议根页面(或家庭/欢迎页面)应该由welcome#index
来处理。 如果你被引导,那么为了生成相应的welcome#index
controller / action,你可以使用下面的命令:
rails generate controller Welcome index
然后,在config/routes.rb
,你可以删除生成器自动添加的GET路由( get "welcome/index"
),并将根路由root 'welcome#index'
(或root :to => 'welcome#index'
在Rails < 4
)顶部的文件,因为它可能是你最受欢迎的路线,应该首先匹配。
还要记得删除Rails < 4
public/index.html
。
(2) 官方Ruby on Rails路由指南使用PagesController
。 它实际上build议pages#main
,但对我来说,更有意义的去与pages#home
(因为“主页”是无处不在的术语/概念)。 此外,此控制器还可以处理其他面向页面的操作,例如pages#about
pages#contact
pages#terms
pages#privacy
等。
(3) Ruby on Rails教程 ,用static_pages#home
和static_pages#help
等等,虽然我不喜欢用“static”来表示这个控制器的想法。 这些网页仍然可能有一些dynamic的方面给他们,特别是网页!
(4)虽然没有讨论如何处理主页 , 但Semi-Static Pages上的RailsCast#117还是提供了另外一种显示资源的方法。
我觉得对1和/或2的偏好。对于“和”场景,你可以使用欢迎#索引和页面#关于等等,而对于“或”场景,你可以使用pages#home,pages#等如果被迫select,我会select2,只是因为你最终代码less。 顺便说一下,2和3几乎是相同的,除了“静态”一词。
当我第一次开始Rails时,我问自己这样的事情。 这是你需要知道的:
- 模型不一定与控制器和视图直接相关。
也就是说,一个特定的控制器/视图组合可以与您需要生成特定页面的多个模型一起工作。
控制器的目的是准备你需要显示的数据集,而不pipe用什么模型来存储数据。
该视图的目的是以最合适的方式显示该数据。
换句话说,控制器/视图组合从来不会在特定的模型下面。 他们使用模型,但不在任何层次关系下。 事实上,他们与他们使用的任何模型都是同等的 。
我觉得困惑来自AWDR和其他介绍性文章中的脚手架生成器示例,例如:
ruby脚本/生成脚手架模型控制器
我知道模型和控制器/视图之间的这种隐含关系让我困惑了一下。 但没有严格的关系,真的。 如果有的话,那么做MVC方法的任何事情都是非常困难的。 显然,事实并非如此。
希望这可以帮助。
– 约翰
最好的做法是你的第一个build议。 创build一个“欢迎”控制器,并从你想要的任何模型调用logging。 有一个根路由指向该控制器。 非常干净和适当。
请注意,在Rails3中,正确的方法是在routes.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
创build新的视图文件app/views/index.html.erb
最后configuration你的config/routes.rb
:
MyApp::Application.routes.draw do match 'home', :to => "static#index" root :to => "static#index" end
这将使/home
和/
去你刚才创build的View文件中的任何东西。
尽可能创build一个名为“适当”的新控制器。 SummaryController? StartController? DailyFrontPageController? 你会有一个想法。
不仅如此,我会认真考虑创build一个新的模型, 而不是基于ActiveRecord的,从您的视图中收集您的作者和发布模型(或其真实姓名)的信息。 另一种方法是在控制器中组装数据,这几乎肯定会是一团糟 – 我每次尝试它时,都会尝试很多。 一个单独的模型似乎结束了很多整齐。
如果处理相对简单,那么为什么不先在控制器中build立数据,然后将输出封装在Struct中,然后用一个真实的类replaceStruct,然后在那里移动构造,一路重构。 它不应该在总时间内添加太多(大部分代码都可以重用),您将会很好地了解哪种方法最适合您。