作为Rails的新手,我很难找到一个网站或参考资料,提供Ruby on Rails的简要总结。我理解MVC,ActiveRecord以及基本级别的那些东西,但我很难理解一些关系和基础知识。例如:
:content_for
或render
部分)以及我不应该使用哪些方式?lib
文件夹的用途吗?我已经在StackOverflow上阅读了关于这个问题的一些回复,但是他们都只是指向我需要阅读的300多页的书,而我只想简要概述什么是重要的。
我已经了解的一些资源,但没有为新用户提供基本概念的简明摘要:
感谢您提供任何帮助,参考或指导!
P.S. I would like this wiki to become a living document, so please add to it, edit it, etc. as you feel necessary.
答案 0 :(得分:63)
<强> 1。我需要注意哪些命名约定?
db表是复数,模型是奇异的,控制器是复数。因此,您拥有由User
表支持的users
模型,并且可通过UsersController
显示。
文件命名为类名的wide_cased版本。所以FooBar
类需要位于名为foo_bar.rb
的文件中。如果您是模块的命名空间,则命名空间需要由文件夹表示。所以如果我们谈论的是Foo::Bar
类,它应该在foo/bar.rb
。
<强> 2。如何构建和命名控制器操作?
控制器操作应该是RESTful。这意味着您应该将控制器视为公开资源,而不仅仅是启用RPC。 Rails具有成员操作与资源收集操作的概念。成员操作是在特定实例上运行的操作,例如/users/1/edit
将是用户的编辑成员操作。集合操作是对所有资源进行操作的操作。所以/users/search?name=foo
将是一个集合动作。
上面的教程描述了如何在路线文件中实际实现这些想法。
第3。在视图中呈现信息的最佳方式是什么(通过:content_for
或渲染部分)以及我不应该使用哪些方式?
content_for
- 例如,能够将视图模板中的某些内容附加到布局模板中。一个很好的例子是添加特定于页面的javascript。
# app/views/layout/application.rb
<html>
<head>
<%= yield :head %>
...
# app/views/foobars/index.html.erb
<% content_for :head do %>
<script type='text/javascript'>
alert('zomg content_for!');
</script>
<% end %>
partials要么是为了分解大文件,要么是为了多次渲染相同的信息。例如
<table>
<%= render :partial => 'foo_row', :collection => @foobars %>
</table>
# _foo_row.html.erb
<tr>
<td>
<%= foobar.name %>
</td>
</tr>
4.什么应该进入帮手?什么不应该?
您的模板中只应包含基本分支逻辑。如果你需要做更强烈的事情,那应该是帮手。观点中的局部变量是对世界上所有善良和正确的东西的憎恶,所以这是一个很好的信号,你应该做一个帮助。
另一个原因是纯代码重用。如果你一遍又一遍地做同样的事情只有轻微的变化,那就把它拉成一个帮手(如果是完全相同的话,它应该是部分的)。
<强> 5。从一开始我需要正确做些什么常见的陷阱?
部分永远不会直接引用实例(@)变量,因为它会阻止重复使用。总是通过:locals => { :var_name => value }
param将数据传递给render函数。
将逻辑排除在与渲染视图无直接关系的视图之外。如果您可以选择在视图中执行某些操作,并在其他位置执行某些操作,那么在其他地方执行此操作的9次中有9次是更好的选择。
我们在铁轨上有一个咒语,就是“胖子模特,瘦小的控制者”。一个原因是模型是面向对象的,控制器是非常程序性的。另一个是模型可以交叉控制器,但控制器不能交叉模型。第三是模型更可测试。这只是一个好主意。
<强> 6。你怎么能模块化代码?这是lib文件夹的用途吗?
lib文件夹用于跨越模型关注点的代码(即不是模型,但将由多个模型使用的东西)。当你需要在那里放东西时,你会知道,因为你无法弄清楚要放入什么模型。在这种情况发生之前,你可以忽略lib。
要记住的是,从rails 3开始,lib不在自动加载路径上,这意味着您需要require
放入其中的任何内容(或将其重新添加)
自动要求lib
目录中所有模块的方法:
#config/initializers/requires.rb
Dir[File.join(Rails.root, 'lib', '*.rb')].each do |f|
require f
end
答案 1 :(得分:2)
前段时间我写了一些命名约定:
所有文件名都遵循相同的约定的snake_case
- 模型:单数(例如Restaurant
)
- 控制器:复数(例如RestaurantsController
)
- 数据库中的表:复数(例如restaurants
)
- 网址:全部为复数(例如/restaurants
,/restaurants/:id
,/restaurants/new
)
rails generate
命令rails g model
Restaurant
name:string rating:integer
rails g migration AddDescriptionTo
Restaurants
description:text
rails g controller
Restaurants
index show
ActiveRecord
方法全部为单数,因为所有ActiveRecord
的方法都链接到模型。
例子:
- Restaurant.all
- Restaurant.create(name: "Burger King", rating: 2)
- Restaurant.find(params[:id])
belongs_to
中的has_many
中的 。因为它有很多元素。
e.g。
class Restaurant < ActiveRecord::Base
has_many :reviews
end
class Review < ActiveRecord::Base
belongs_to :restaurant
end
多个:
resources :restaurants
index
:复数(因为我们正在显示元素列表)。例如restaurants_path
。也可用于create
。show
:单数(我们只显示一个元素,它需要括号内的元素)。例如restaurant_path(@restaurant)
。也可以用于update
&amp; delete
。new
:单数。例如new_restaurant_path