我有一个标准的Ruby on Rails Spree Commerce应用程序,并设法使用Capistrano进行部署。现在我想在我的左上角菜单中添加一个额外的页面,显示为“关于”。
我还不太了解Rails是如何工作的。我的一个朋友说Rails基本上从git中获取所有东西,如果你想要做出不同的东西,你必须制作覆盖或额外的页面。
所以编辑“主”布局页面(类似于ASP.NET的MVC4)不是我想添加菜单项的选项。除此之外,我需要一个控制器和视图。
guide说我应该执行以下操作:
创建所需的控制器和视图目录:
mkdir -p app/controllers/spree
mkdir -p app/views/spree/about
接下来,在我们刚刚创建的目录中创建一个名为about_decorator.rb的新文件:
module Spree
AboutController.class_eval do
[Model parts I want to send to the view]
end
end
我们还需要在config / routes.rb文件中添加一个指向此操作的路由。我们现在就这样做。更新路由文件以包含以下内容:
Spree::Core::Engine.routes.draw do
get "/about" => "about"
end
我想知道的是Rails是如何工作的(我朋友关于git和覆盖的故事是真的吗?)以及关于网站本身:如何在菜单中建立链接以及如何调整页面并向其添加内容。< / p>
我希望有人可以提供一些见解,链接和/或解释!
答案 0 :(得分:2)
这将是MVC的简单解释,以及框架的基本内部。
模型 - 模型只是应用程序的数据。不需要数据库,但在rails世界中,模型通常连接了一些数据库。
查看 - 视图严格来说是用户看到的内容。视图中应该有很少的逻辑。只有被视为“视图逻辑”的东西。这是一个简单的检查,以查看用户是否已登录,因此您应显示其名称或登录按钮。虽然,有些人会争辩说把它放到视图助手那里。无论哪种方式,您都不应该在视图中进行计算。这就是模型的重点。
控制器 - 控制器应该是一个非常薄的层,只能抓取请求所需的信息。在这种情况下,请求是单页面视图。
rails开发人员之间有一个共同的思维过程,那就是“瘦控制器,胖模型”。这基本上表明您的控制器应该非常小。大多数应用程序逻辑应该包含在模型中,只留下控制器中的请求信息。
注意:您的模型应该不了解您的观点,您的观点不应该对您的模型有任何了解。这意味着,您的观点永远不会直接使用您的模型。
config/routes.rb
- 是一个描述应用程序中所有路由的文件。路由类似http://example.com/users/1
,很可能指向用户个人资料。路由用于让应用程序知道每个请求使用哪些控制器,方法和名称。
rake routes
- rake
是一个命令行工具,在ruby应用程序中很常见。它允许您创建任务并执行它们。在这种情况下,routes
任务会解析整个config/routes.rb
文件,并告诉您应用程序中可用的路由以及为每条路由指定的相应名称。
部分视图 - 简单地说,部分视图只是视图的一部分。这是常见的事情,特别是对于可以在单个应用程序的多个页面上使用的表单。使用partials的原因通常是通过您的视图删除重复。所有部分视图都以_
为前缀命名。因此,它可能类似于_navigation.html.erb
或_form.html.haml
。 (erb和haml是两种常见的HTML呈现引擎)。
将项目添加到导航栏与在ASP应用程序中编辑“母版页”非常相似。您只需要找到需要编辑的部分。在您的视图中,按照<%= render :partial => 'spree/shared/header' %>
声明,直到找到您需要编辑的文件。注意,如果这是您需要遵循的实际文件,我不是肯定的,请查看spree_application.html.erb
文件以查看您需要关注的文件。该文件实质上与您习惯使用的“母版页”相同。
您需要创建一个新的控制器,或者如果已经有一个适合您尝试完成的任务,您可以在该控制器中创建一个新方法。
如果您需要操作或显示某些数据,您还需要一个模型。您可以创建一个,也可以只使用任何负责您已有数据的文件。
您需要在routes.rb
文件中添加路线,以便您的应用知道要使用哪个controller#method
。
运行rake routes
将为您提供有关刚刚添加的新路线的信息。请注意,如果您有一条名为user_profile
的路线,您将获得便利方法,以便您轻松链接到路线。您可以使用user_profile_path
或user_profile_url
来建立链接。我建议使用*_path
在您自己的网站上建立链接,因为它使用相对路径/user/1
而不是http://example.com/user/1
。 *_url
会给后者。通常只有在使用某种形式的API时才使用*_url
,并希望将链接发回给您的应用程序。