1. 我需要注意哪些命名约定?
db table 是复数,model 是单数,controller 是复数。因此,您拥有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
当您希望能够将 html 从内部模板附加到外部模板时应该使用它——例如,能够将视图模板中的某些内容附加到布局模板中。一个很好的例子是添加特定于页面的 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 }
参数将数据传递给渲染函数。
将与呈现视图没有直接关系的逻辑排除在视图之外。如果您可以选择在视图中做某事,然后在其他地方做,那么 10 次中有 9 次在其他地方做是更好的选择。
我们在 Rails 中有一个口头禅,那就是“胖模型,瘦控制器”。一个原因是模型是面向对象的,控制器是天生的过程。另一个是模型可以跨控制器,但控制器不能跨模型。第三是模型更具可测试性。这只是一个好主意。
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