我在新继承的ruby / rails项目中看到了这一点, 并想知道:
module Canonicalizer
# Redirects the client to the canonical url
#
# @return [undefined]
#
# @api private
def redirect_to_canonical_url
if request.get? && !canonical_url?
redirect_to canonical_url, status: :moved_permanently
false
else
true
end
end
# Test if the current request URL is canonical
#
# @return [Boolean]
#
# @api private
def canonical_url?
request.path == canonical_url
end
end
require 'canonicalizer/hub_page_canonical'
答案 0 :(得分:4)
Ruby代码未编译,正在解析器中[大部分]被处理。也就是说,以下两段代码并不等效:
class Foo; def foo; :first; end; end
class Foo; def foo; :second; end; end
Foo.new.foo #⇒ :second
vs。
class Foo; def foo; :second; end; end
class Foo; def foo; :first; end; end
Foo.new.foo #⇒ :first
此外,Kernel#require
是在Kernel
模块上定义的常规函数。我可以想到'canonicalizer/hub_page_canonical'
文件取决于Canonicalizer
模块(例如,它包含include Canonicalizer
的类的定义。)要使该文件成为可能,必须先声明包含的模块,因此require
紧随其定义。
答案 1 :(得分:0)
一个可能的原因是,当通过require 'canonicalizer/hub_page_canonical'
要求使用库时,如果未在module Canonicalizer
上定义这些方法,则会发生某些变化。
可能是某种类型的元编程,或者仅仅是在代码加载时调用了这些方法。
Ruby是一种语言,代码可以在加载时和运行时同时运行。
答案 2 :(得分:0)
在Rails应用中看到require
很奇怪,这本不应该出现。话虽这么说,我必须这样做是为了避免无限循环,当一个文件需要另一个文件来解析其常数时(通过rails autoloader)。
我的建议是忘记这一点,删除所有看到的require
,并通过文件和文件夹名称的约定使用标准自动加载。