Ruby on Rails基本概念摘要

时间:2011-03-05 16:14:02

标签: ruby-on-rails reference conventions summary

作为Rails的新手,我很难找到一个网站或参考资料,提供Ruby on Rails的简要总结。我理解MVC,ActiveRecord以及基本级别​​的那些东西,但我很难理解一些关系和基础知识。例如:

  1. 我需要注意哪些命名约定?
  2. 如何构建和命名控制器操作?
  3. 在视图中呈现信息的最佳方式是什么(通过:content_forrender部分)以及我不应该使用哪些方式?
  4. 什么应该进入帮助者,什么不应该?
  5. 从一开始我需要做些什么常见的陷阱或事情?
  6. 如何模块化代码?那是lib文件夹的用途吗?
  7. 我已经在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.

2 个答案:

答案 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或渲染部分)以及我不应该使用哪些方式?

当您希望能够将内部模板中的html附加到外部模板时,应使用

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)

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

Rails约定

常规

所有文件名都遵循相同的约定的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中的
  • 奇异。因为它属于一个元素。
  • {li> 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