我的主页(或欢迎页面)将包含两个模型的数据(我们称之为作者和帖子)。我是rails的新手,并不确定实现这一目标的最佳方法是什么。
我应该创建一个名为welcome的新控制器,它从作者和帖子中收集数据,然后在欢迎索引视图中显示它们吗?或者我应该在帖子模型下有一个欢迎视图,它也可以从作者那里获取数据?或者以其他方式实现这一目标?
我理解如何在技术上完成所有这些操作,但只是不确定使用rails框架的最佳实践方法是什么。
答案 0 :(得分:119)
似乎没有一种最佳做法。
(1)标准config/routes.rb
文件似乎建议根页(或主页/欢迎页面)应由welcome#index
处理。如果您受到指导,那么要生成相应的welcome#index
控制器/操作,您可以使用以下命令:
rails generate controller Welcome index
然后,在config/routes.rb
中,您可以删除生成器自动添加的GET路由(get "welcome/index"
),并将根路由root 'welcome#index'
(或root :to => 'welcome#index'
放在Rails中< 4
)位于文件顶部,因为它可能是您最受欢迎的路线,应该先匹配。
另请记住在Rails public/index.html
中删除< 4
。
(2) official Ruby on Rails routing guide使用PagesController
。它实际上建议pages#main
,虽然对我来说更合理的是pages#home
(因为“主页”是无处不在的术语/概念)。此外,此控制器还可以处理其他面向页面的操作,例如pages#about
,pages#contact
,pages#terms
,pages#privacy
等。
(3) Ruby on Rails Tutorial,static_pages#home
和static_pages#help
等等,虽然我不喜欢用此表示此控制器的想法“静态的”。这些页面仍然可能会有一些动态方面,尤其是主页!
(4)虽然它没有讨论如何处理主页,但RailsCast #117 on Semi-Static Pages建议另外一套显示的方法> - 只有资源。
我觉得偏向于1和/或2.使用“和”方案,您可以使用welcome #index和pages#about等,而使用“或”方案,您可以使用页面#home,pages #about等。如果被迫选择,我会选择2,因为你最终会得到更少的代码。除了“静态”这个词之外,顺便说一下,2和3几乎是一样的。
答案 1 :(得分:51)
问题是,您的主页只是一个目标网页还是一组网页?如果它只是一个目标网页,您不希望您的用户长时间在那里闲逛,除非去其他地方。如果它是一组页面,或类似于现有组,您可以向控制器添加最喜欢的操作。
我为当前项目所做的是创建一个名为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
假设您正确定义了模型关系,那么匹配它的模板将非常简单。
祝你好运,希望这会有所帮助。答案 2 :(得分:28)
也就是说,特定的控制器/视图组合可以与生成该特定页面所需的模型一起使用。
控制器的目的是准备您需要显示的数据集,而不管用于存储该数据的模型。
视图的目的是以最恰当的方式显示数据。
换句话说,控制器/视图组合永远不会在特定模型下“。他们使用模型,但在任何层次关系中都不属于它们。事实上,无论他们使用什么模型,他们都是同行。
我认为混淆来自AWDR和其他介绍性文本中的脚手架生成器示例,例如:
ruby脚本/生成脚手架模型控制器
我知道模型与控制器/视图之间的这种隐含关系让我感到困惑。但真的没有严格的关系。如果有,那么使用MVC方法做任何复杂的事情都是非常困难的。显然,事实并非如此。
希望这有帮助。
- 约翰
答案 3 :(得分:11)
最佳做法是您的第一个建议。创建一个“欢迎”控制器,并从您想要的任何模型调用记录。有一个根路由指向该控制器。非常干净和适当。
答案 4 :(得分:9)
请注意,在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
答案 5 :(得分: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文件中的任何内容。
答案 6 :(得分:6)
尽可能正确地创建一个名为的新控制器。 SummaryController? StartController? DailyFrontPageController?你会有一个想法。
不仅如此,我还要认真考虑创建一个新的模型,不基于ActiveRecord,从您的作者和帖子模型(或其真实姓名)收集信息,以便在你的看法。另一种方法是在控制器中组装数据,这几乎肯定会很混乱 - 每当我尝试它时,我都尝试了很多。一个单独的模型似乎最终更加整洁。
如果处理相对简单,为什么不首先尝试在控制器中构建数据,然后将输出包装在Struct中,然后用实际类替换Struct并在那里移动构造,一直重构。它不应该增加太多时间(大部分代码可以重复使用),你会很好地了解什么最适合你。