Ruby on rails Rails:ControllerClass第一行中提到的方法何时执行?

Ruby on rails Rails:ControllerClass第一行中提到的方法何时执行?,ruby-on-rails,Ruby On Rails,我遇到了写在ControllerClass范围内的方法调用,类似于(in): class MoviesController

我遇到了写在ControllerClass范围内的方法调用,类似于(in):

class MoviesControllerpagination_header:index#您正在查看的方法只是一个类方法。没有控制器范围,但我理解你的直觉告诉你的

在Ruby中有许多“范围门”,比如
class
关键字、
def
关键字、
module
关键字。每次通过范围门时,消息的隐式接收方都会发生变化。隐式接收者是关键字
self
引用的对象。记住,Ruby中的所有方法都是消息,传递给显式或隐式接收方。通过点符号(
receiver.method
)可以很容易地识别显式接收器

每当你在Ruby中遇到一行代码时,你应该问自己:“现在谁是self?”。如果您回答这个问题,您将知道在哪里查找方法定义

在您的示例中,有一个范围是由
class
关键字(
class MoviesController
)启动的。这意味着隐式接收者(或self)就是类本身。试试这个

class MyClass
  self #=> MyClass
end

我能找到的一个很好的初学者教程是。如果您想深入研究Ruby对象模型,我推荐P.Perotta的《元编程Ruby》一书。

您正在研究的方法只是一个类方法。没有控制器范围,但我理解你的直觉告诉你的

在Ruby中有许多“范围门”,比如
class
关键字、
def
关键字、
module
关键字。每次通过范围门时,消息的隐式接收方都会发生变化。隐式接收者是关键字
self
引用的对象。记住,Ruby中的所有方法都是消息,传递给显式或隐式接收方。通过点符号(
receiver.method
)可以很容易地识别显式接收器

每当你在Ruby中遇到一行代码时,你应该问自己:“现在谁是self?”。如果您回答这个问题,您将知道在哪里查找方法定义

在您的示例中,有一个范围是由
class
关键字(
class MoviesController
)启动的。这意味着隐式接收者(或self)就是类本身。试试这个

class MyClass
  self #=> MyClass
end

我能找到的一个很好的初学者教程是。如果您想深入研究Ruby对象模型,我推荐P.Perotta的《元编程Ruby》一书。

rails中的每一件事都是与这些对象相关联的对象或方法

让我们举一个例子,正如您所问的行动前
或行动后

让我们先看一下rails**
型号
:**

class Subscription < ActiveRecord::Base
  before_create :record_signup

  private
    def record_signup
      self.signed_up_on = Date.today
    end
end
应用程序控制器继承自
ActionController::Base

class ApplicationController < ActionController::Base
  before_action :require_login

  private

  def require_login
    unless logged_in?
      flash[:error] = "You must be logged in to access this section"
      redirect_to new_login_url # halts request cycle
    end
  end
end

上面是定义,但我们不调用它,因此在通过路由调用它之前,它不会被执行。

rails中的每件事都是与这些对象关联的对象或方法

让我们举一个例子,正如您所问的行动前
或行动后

让我们先看一下rails**
型号
:**

class Subscription < ActiveRecord::Base
  before_create :record_signup

  private
    def record_signup
      self.signed_up_on = Date.today
    end
end
应用程序控制器继承自
ActionController::Base

class ApplicationController < ActionController::Base
  before_action :require_login

  private

  def require_login
    unless logged_in?
      flash[:error] = "You must be logged in to access this section"
      redirect_to new_login_url # halts request cycle
    end
  end
end

上面是定义,但我们不调用它,因此在通过路由调用它之前不会执行它。

Rails使用ActiveDispatch::Callbacks中间件确保回调运行。这是一个机架兼容的中间件,这意味着它可以添加到中间件链中的任何位置。当请求命中Rails时,它决定哪个控制器操作将为请求提供服务,并且基本上在回调之前和之后包装控制器操作

只要中间件实现了Rack的接口,您就可以按照自己喜欢的顺序调用它们。因此,我猜在调用Rack interface的“call”方法运行调用之前,执行调用之前的
,然后执行调用之后的
。响应在过程中得到增强(或不增强)。可能会添加一些头,响应体中会有一些更改,或者根本没有任何更改,例如日志记录

如果您想更多地了解回调是如何包装的,您应该查看一下,尽管您自己的回调很容易完成

class ARailsController
  def self.after_action(callback)
    @@after_callbacks ||= []
    @@after_callbacks << callback
  end

  def execute_callbacks
    @@after_callbacks.each { |callback| callback.call() }
  end
end

class MyController < ARailsController
  after_action Proc.new { puts "This will be executed afterwards" }
  after_action Proc.new { puts "Save this for later" }
end

controller = MyController.new
controller.execute_callbacks
类ARailsController
def self.after_action(回调)
@@| | |回调后=[]

@@after_callbacksRails使用ActiveDispatch::callbacks中间件确保回调运行。这是一个机架兼容的中间件,这意味着它可以添加到中间件链中的任何位置。当请求命中Rails时,它决定哪个控制器操作将为请求提供服务,并且基本上在回调之前和之后包装控制器操作

只要中间件实现了Rack的接口,您就可以按照自己喜欢的顺序调用它们。因此,我猜在调用Rack interface的“call”方法运行调用之前,执行调用之前的
,然后执行调用之后的
。响应在过程中得到增强(或不增强)。可能会添加一些头,响应体中会有一些更改,或者根本没有任何更改,例如日志记录

如果您想更多地了解回调是如何包装的,您应该查看一下,尽管您自己的回调很容易完成

class ARailsController
  def self.after_action(callback)
    @@after_callbacks ||= []
    @@after_callbacks << callback
  end

  def execute_callbacks
    @@after_callbacks.each { |callback| callback.call() }
  end
end

class MyController < ARailsController
  after_action Proc.new { puts "This will be executed afterwards" }
  after_action Proc.new { puts "Save this for later" }
end

controller = MyController.new
controller.execute_callbacks
类ARailsController
def self.after_action(回调)
@@| | |回调后=[]

@@在回调之后,我完全理解
self
(这是Ruby的
this
)指的是封闭的范围,但不幸的是