一个rails项目的目录如下图所示,这个目录可以通过”rails new 项目名称”生成
我们主要关注app,config,db这几个文件夹的内容。
app文件夹
app文件夹中含有rails项目的主要内容:
这里包含了MVC设计模式中的三个基本部分,即模型(model文件夹),视图(view文件夹),控制器(controllers文件夹)。
controllers文件夹:
其中每一个rb脚本就是一个控制器,具体用途。。。
view文件夹:
主要是储存网页页面的内容
其中每一个文件夹就是对应一个控制器的视图文件,其中一个文件夹中的内容:
这里的一个嵌入ruby的html文件就是一个网页的页面,可以看到一个控制器可以对应多个页面
Model文件夹:
这里每个rb脚本都对应一个模型文件,可以看到不是每个控制器都对应一个模型文件,只有需要使用数据库和数据库操作的才需要有模型文件。
config文件夹
Config文件夹主要是各种配置文件,我们要关注的主要是routes.rb文件,为了了解其作用我们先来了解下rails的执行流程。
Rails严格遵循MVC模式,因此首先用户在浏览器中向控制器发出请求。控制器的action处理用户请求后,决定将指定的视图页面呈献给用户,而处理结果也在该视图页面中呈现。
例如,在浏览器地址栏中输入了http://localhost:3000/user/show/1, rails处理这个请求的流程如下:
1. 为用户发送一个请求,rails路由器对请求进行解析,
2. 从而决定使用哪个控制器中的哪个action方法来处理用户请求。
URL请求格式如下:http://域名:端口/控制器/控制器中action方法名/请求参数 ,
因此,当用户发送URL请求,http://localhost:3000/user/show/1,rails将会在应用程序中找到,user控制器,调用show这个action方法,并将1这个参数传给该方法。
3. 控制器中的方法调用对应的模型对象的业务逻辑方法。模型对象继承
ActionRecord::Base类,因而具有持久化访问的能力,
例如,当用户发送http://localhost:3000/user/show/1请求时,rails调用user控制器中的show方法来处理该请求。如果该方法增加以下代码:
@user=User.find(params[:id])
这行代码实际上调用了,User模型(类)的find(1)方法,User模型类(继承自
ActionRecord::Base类)与数据库交互,查找user表中id为1的记录,并返回查询到的User实例,并将这个User实例设置成控制器的实例变量。
4. 控制器将处理结果交给视图文件,视图文件负责显示控制器的处理结果。Rails会保证
视图文件能访问到控制器中的实例变量。
如果控制器没有显示的调用render方法将处理结果提交给视图页面,控制器默认把处理结果提交给app\views\控制器名\方法名.html.erb。对于上述请求,控制器user_controller默认将处理结果提交到app\views\user\show.html.erb。然后,在app\views\user\show.html.erb中访问控制器的实例变量@user获取数据库中的数据。
5. 视图文件发送相相应到用户的浏览器,最终结果呈现给用户。
这里的路由就是rails服务器工作流程的第一步。
下面我们从路由开始解析上面的例子
routes.rb的代码如下
resources :people
root :to => "welcome#index"
get "welcome/say_hello"=>"welcome#say"
get "welcome" => "welcome#index"
get"welcome/say_hello"=>"welcome#say"就是一条简单的路由
这行代码的意思就是"welcome/say_hello"这个url对应的是welcome控制器中的say_hello方法。
而上面的resources :people这条语句是一个资源路由,资源路由提供了HTTP响应,控制器action和数据库CRUD操作之间的映射。
这行代码事实上生成了7个不同的路由,这7个路由分别用于新增,查看,修改和删除等操作。每个路由对应的URL,方法,作用如表所示:
http响应 | URL | 对应的方法 | 作用 |
GET | /users | index | 以列表形式显示所有数据 |
GET | /users/new | new | 转到创建新数据的HTML页面 |
POST | /users | create | 创建新的数据 |
GET | /users/1 | Show | 根据id显示单条数据 |
GET | /users/1/edit | Edit | 根据id编辑数据 |
PUT | /users/1 | Update | 根据id更新数据 |
DELETE | /users/1 | destroy | 根据id删除数据 |
然后就到了控制器环节,首先我们了解一下控制器基类,ApplicationController::base
默认情况下,rails应用程序的application类继承自ActionController::base类,而其他的controller类均继承自application类。这样为我们提供了一个统一的接口。
这个例子的people_controller.rb代码如下:
class PeopleController <ApplicationController
before_action :set_person, only: [:show, :edit, :update, :destroy]
#GET /people
#GET /people.json
defindex
@people = Person.all
End
………………………..
动作的默认模板放在app/views/控制器名称目录下,对应的是动作名称.html.erb文件,例如上述代码中的index动作会使用模板\app\views\people\index.html.erb,并传递默认的@people参数。
\app\views\people\index.html.erb中的代码如下:
<h1>Listing people</h1>
<tbody>
<% @people.each do |person| %>
<tr>
<td><%= person.name %></td>
<td><%= person.bio %></td>
<td><%= person.birthday %></td>
<td><%= link_to 'Show', person %></td>
<td><%= link_to 'Edit', edit_person_path(person)%></td>
<td><%= link_to 'Destroy', person, method: :delete, data: {confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</tbody>
</table>
<br>
<%= link_to 'New Person',new_person_path %>
这里将由控制器传过来的实例变量@people显示出来,这就是rails工作的整个流程。