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

基本上步骤是:

  1. 加载了Rails初始化程序( http://api.rubyonrails.org/classes/Rails/Initializer.html

  2. rails初始化程序设置日志记录,然后加载environment.rb

  3. environment.rb加载boot.rb

  4. boot.rb设置RAILS_ROOT常量,并将rails库和应用程序代码添加到LOAD_PATH

  5. environment.rb执行Rails::Initializer.run

  6. rails框架已加载(ActiveRecord,ActionMailer等)

  7. 加载了您环境的特定配置文件(config / environments / development.rb。)

  8. 如果您已创建任何回调,则执行after_initializeto_prepare回调

  9. 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的这篇文章 。