Rails应用程序的生命周期
我正在尝试学习rails应用程序的生命周期。 application_controller.rb何时运行? 每次改变或每次请求时它只是一次吗?
我想知道以下文件:
- config / environments / * .rb(开发,生产或测试,取决于当前模式)
- 的boot.rb
- 的environment.rb
- 的routes.rb
我问这个的原因之一是,我想知道哪里是个好地方
- 初始化代码
- 自定义配置数据
编辑:
@Gdeglin的答案很好,但我真的很想知道每个文件何时运行。
application_controller.rb
ApplicationController是所有控制器的父类。 由于这个原因,所有控制器都可以使用其中声明的方法。
ApplicationController是您希望应用于应用程序中所有控制器的filter的便利位置,或者是您希望为所有控制器提供的方法。
配置/环境/ *。RB
config / environments / * .rb中的文件会覆盖默认config / enviornment.rb文件中的设置,具体取决于服务器运行的环境(开发/生产)。 一个例子是,在开发错误被打印到屏幕上并且在生产中返回通用错误页面。 此设置位于config / environments / development.rb中
的boot.rb
boot.rb用作rails初始化过程的一部分。 您通常不需要,也可能不应该触摸它。
的environment.rb
environment.rb是应用程序的通用配置文件。
的routes.rb
routes.rb用于定义应用程序处理特定URL请求的方式。 例如,您可能希望将所有404请求转到特定操作,而不是由默认error handling程序处理:
map.connect '*path', :controller => 'home', :action => 'on_404'
它也是实现RESTful应用程序的重要部分。
在哪里放置初始化和配置代码
初始化代码和自定义配置数据都应放在enviornment.rb中(阅读此文件中的注释)。 如果您希望某些代码仅在开发期间或仅在生产中运行,请将其分别放在config / environments / development.rb或config / environments / production.rb中。
编辑:
可以在此处获得有关何时在初始化期间运行这些文件的详细信息:
http://toolmantim.com/articles/environments_and_the_rails_initialisation_process https://github.com/toolmantim/toolmantim/blob/master/articles/environments_and_the_rails_initialisation_process.haml
基本上步骤是:
-
加载了Rails初始化程序( http://api.rubyonrails.org/classes/Rails/Initializer.html )
-
rails初始化程序设置日志记录,然后加载environment.rb
-
environment.rb加载boot.rb
-
boot.rb设置
RAILS_ROOT
常量,并将rails库和应用程序代码添加到LOAD_PATH
-
environment.rb执行
Rails::Initializer.run
。 -
rails框架已加载(ActiveRecord,ActionMailer等)
-
加载了您环境的特定配置文件(config / environments / development.rb。)
-
如果您已创建任何回调,则执行
after_initialize
和to_prepare
回调 -
Rails已完成加载并准备好处理请求
只需稍加努力,您就可以自己完成,这可能会更有用。
从’ruby script / server’开始。 在我的(2.1)应用程序中,查找“script”目录中名为“server”的文件。 它包含这个:
#!/usr/bin/env ruby require File.dirname(__FILE__) + '/../config/boot' require 'commands/server'
所以它需要boot.rb,它定义了很多东西,然后调用Rails.boot!
或多或少运行您已定义的任何预初始化,然后需要environment
,这将进行另一级别的自举。 到那时它开始变得复杂了:我推荐一张大纸…
等等。
或者,您可能能够在Kernel#require
文件时破解Kernel#require
以进行记录 – 我自己没有尝试过(并且该方法可能会在其他地方被覆盖)但它可以正常工作……
application_controller根本不是“运行” – 它是其他控制器的父类,因此在加载inheritance控制器时,如果需要但不覆盖它的内容。 您通常使用它来提供所有控制器的通用function。
以下是我在代码中放入一堆print语句时所观察到的:
每个请求都“运行”application_controller和posts_controller(例如)。 不在方法def / end内的每行代码都在两个控制器中执行,然后代码流传递给请求/路由方法。
因为这不是我所期望的,我认为值得发布它。 如果我错了请随时编辑。
对于Heroku,如果print语句在某个方法内部,由于某种原因,print语句输出仅显示在stdout日志中。 但我相信以上描述仍然适用。
通常的做法是将初始化内容放在config / initializers /目录中。 这样你就可以保持你的environment.rb文件干净(呃)。
请参阅Ryan Daigle的这篇文章 。