Ruby on Rails基本概念摘要

iwa*_*bed 36 ruby-on-rails reference conventions summary

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

  1. 我需要注意哪些命名约定?
  2. 如何构建和命名控制器操作?
  3. 在视图中(通过:content_forrender部分)呈现信息的最佳方法是什么?我不应该使用哪些方法?
  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.

Mat*_*ggs 65

1.我需要注意哪些命名约定?

db表是复数,模型是单数,控制器是复数.所以你拥有Userusers表支持的模型,并通过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 %>
Run Code Online (Sandbox Code Playgroud)

部分要么是为了分解大文件,要么是为了多次呈现相同的信息.例如

<table>
  <%= render :partial => 'foo_row', :collection => @foobars %>
</table>

# _foo_row.html.erb

<tr>
 <td>
  <%= foobar.name %>
 </td>
</tr>
Run Code Online (Sandbox Code Playgroud)

4.什么应该进入帮助者,什么不应该?

您的模板应该只包含基本的分支逻辑.如果你需要做更强烈的事情,那应该是帮手.视图中的局部变量是对世界上所有善良和正确的东西的憎恶,所以这是一个很好的迹象,你应该做一个帮手.

另一个原因是纯代码重用.如果你一遍又一遍地做同样的事情只有轻微的变化,那就把它拉成一个帮手(如果是完全相同的话,它应该是部分的).

5.从一开始我需要正确做些什么常见的陷阱?

partials 永远不应该直接引用实例(@)变量,因为它会阻止重用.总是通过: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
Run Code Online (Sandbox Code Playgroud)

  • 非常彻底,易于理解马特,感谢您抽出宝贵时间回答! (2认同)
  • 您能否详细解释一下“另一个是模型可以跨控制器,但控制器不能跨模型”? (2认同)

小智 7

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

Rails 约定

一般的

所有文件名均采用蛇形命名法,遵循相同的约定 - 型号:单数(例如Restaurant) - 控制器:复数(例如RestaurantsController) - 数据库中的表:复数(例如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方法

全部都是单一的,因为所有ActiveRecord的方法都与模型相关联。例子: - 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
Run Code Online (Sandbox Code Playgroud)

路线

资源

定义资源的路由时使用复数:

resources :restaurants
Run Code Online (Sandbox Code Playgroud)

路线助手

  • index复数(因为我们显示的是元素列表)。例如restaurants_path。也可用于create.
  • show:单数(我们只显示一个元素,它需要括号内的元素)。例如restaurant_path(@restaurant)。也可用于update& delete
  • new单数。例如new_restaurant_path