43

作为 Rails 的新手,我很难找到提供 Ruby on Rails 概要的网站或参考资料。我基本了解 MVC、ActiveRecord 和类似的东西,但我很难理解其中的一些关系和基础知识。例如:

  1. 我需要注意哪些命名约定?
  2. 控制器动作应该如何组织和命名?
  3. :content_for在视图(通过或部分)中呈现信息的最佳方式是render什么?我不应该使用哪些方式?
  4. 什么应该进入助手,什么不应该?
  5. 什么是常见的陷阱或我需要从一开始就正确做的事情?
  6. 如何模块化代码?这个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.

4

2 回答 2

78

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
于 2011-03-05T17:03:19.400 回答
4

我前段时间写了一些命名约定:

Rails 约定

一般的

所有文件名都在蛇大小写遵循相同的约定 - 模型:单数(例如Restaurant) - 控制器:复数(例如RestaurantsController) - DB中的表:复数(例如)restaurants- URL:全部复数(例如/restaurants,,/restaurants/:id/restaurants/new

rails generate命令

  • 创建模型:单数(因为模型的名称是单数)。例如rails g model Restaurant name:string rating:integer
  • 创建迁移:复数(因为我们使用表的名称)。例如rails g migration AddDescriptionToRestaurants description:text
  • 创建控制器:复数,例如rails g controller Restaurants index show

型号(单数)

ActiveRecord方法

都是单数,因为 allActiveRecord的方法都与模型相关联。例子: - Restaurant.all - Restaurant.create(name: "Burger King", rating: 2) -Restaurant.find(params[:id])

协会

  • 中的单数belongs_to。因为它属于一个元素。
  • 中的复数has_many。因为它有很多元素。

例如

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& delete
  • new:单数。例如new_restaurant_path
于 2017-11-29T17:41:50.903 回答