Ruby on rails Rails:ControllerClass第一行中提到的方法何时执行?
我遇到了写在ControllerClass范围内的方法调用,类似于(in):Ruby on rails Rails:ControllerClass第一行中提到的方法何时执行?,ruby-on-rails,Ruby On Rails,我遇到了写在ControllerClass范围内的方法调用,类似于(in): class MoviesController
class MoviesController pagination_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
)指的是封闭的范围,但不幸的是