我的主页(或欢迎页面)将包含来自两个模型的数据(我们称之为作者和帖子).我是rails的新手,并不确定实现这一目标的最佳方法是什么.
我应该创建一个名为welcome的新控制器,它从作者和帖子中收集数据,然后在欢迎索引视图中显示它们吗?或者我应该在帖子模型下有一个欢迎视图,它也可以从作者那里获取数据?或任何其他方式来实现这一目标?
我理解如何在技术上完成所有这些,但只是不确定使用rails框架的最佳实践方法是什么.
似乎没有一个单一的最佳实践.
(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)的on Rails的Ruby的教程,去与static_pages#home
和static_pages#help
等等,虽然我不喜欢与"静",表示该控制器的想法.这些页面仍然可能会有一些动态方面,尤其是主页!
(4)虽然它没有讨论如何处理主页,但半静态页面上的RailsCast#117提出了另一套显示资源的方法.
我觉得偏向1和/或2.使用"和"方案,你可以使用welcome #index和pages#about等,而使用"or"方案,你可以使用#home,pages#about,如果被迫选择,我会选择2,因为你最终会得到更少的代码.除了"静态"这个词之外,顺便说一下,2和3几乎是一样的.
问题是,您的主页只是一个登录页面还是一组页面?如果它只是一个目标网页,您不希望您的用户长时间在那里闲逛,除非去其他地方.如果它是一组页面,或类似于现有组,您可以向控制器添加最喜欢的操作.
我为当前项目所做的是创建一个名为controller的控制器Static
,因为我需要3个静态页面.主页是其中之一,因为除了去其他地方之外没有任何东西可以看或做.
要映射默认路由,请使用以下内容routes.rb
:
# Place at the end of the routing! map.root :controller => 'MyController', :action => :index
在我的情况下,这将是:
map.root :controller => 'static', :action => :index
如果您愿意,可以为此主页创建一个控制器.我称之为主要内容,或者您可以记住与主页相关的内容.从那里,您可以获取数据和模型,并按照输出视图.
class MainController < ApplicationController def index @posts = Posts.find(:all, :limit => 10, :order => 'date_posted', :include => :user) end end
假设您正确定义了模型关系,匹配它的模板将非常简单.
祝你好运,希望这会有帮助.
当我第一次启动Rails时,我问自己这样的事情.这是你需要知道的:
模型不一定与控制器和视图直接相关.
也就是说,特定的控制器/视图组合可以与生成该特定页面所需的模型一起使用.
控制器的目的是准备您需要显示的数据集,而不管用于存储该数据的模型.
视图的目的是以最合适的方式显示该数据.
换句话说,控制器/视图组合永远不会在特定模型之下.他们使用模型,但在任何层次关系中都不属于它们.事实上,他们与他们使用的任何模型都是对等的.
我认为混淆来自AWDR中的脚手架生成器示例和其他介绍性文本,例如:
ruby脚本/生成脚手架模型控制器
我知道模型和控制器/视图之间的这种隐含关系让我感到困惑.但真的没有严格的关系.如果有,那么使用MVC方法做任何复杂的事情都是非常困难的.显然,事实并非如此.
希望这可以帮助.
- 约翰
最好的做法是你的第一个建议.创建一个"欢迎"控制器,并从您想要的任何模型调用记录.有一个根路由指向该控制器.非常干净和适当.
请注意,在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
创建新的View文件 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文件中的任何内容.
尽可能正确地创建一个名为的新控制器.SummaryController?StartController?DailyFrontPageController?你会有一个想法.
不仅如此,我还要认真考虑创建一个新模型,而不是基于ActiveRecord的模型,它从您的作者和帖子模型(或其真实姓名)中收集信息,以便在您的视图中显示.另一种方法是在控制器中组装数据,这几乎肯定会很混乱 - 每当我尝试它时,我都尝试了很多.一个单独的模型似乎最终更加整洁.
如果处理相对简单,为什么不首先尝试在控制器中构建数据,然后将输出包装在Struct中,然后用实际类替换Struct并在那里移动构造,一直重构.它不应该给总时间增加太多(大部分代码都可以重复使用),你会很好地了解什么最适合你.