我创建了一个gem并将其集成到我的rails应用程序中。当我像这样调用我的方法时,它可以工作:
<div class="container">
<%= yield %>
<%= JeuxDuLoto_drawing() %>
</div>
但是当我这样称呼它时:
<div class="container">
<%= yield %>
<%= JeuxDuLoto_drawing %>
</div>
我收到此错误:uninitialized constant ActionView::CompiledTemplates::JeuxDuLoto_drawing
我使用Railties添加此方法:
module JeuxDuLoto
class Railtie < Rails::Railtie
initializer "JeuxDuLoto.action_view" do
ActiveSupport.on_load(:action_view) do
include JeuxDuLoto::Helper
end
end
end
end
辅助模块包含我的方法。
答案 0 :(得分:2)
如果没有括号,ruby认为你引用的是常量JeuxDuLoto_drawing
而不是相同名称的方法。
方法通常以ruby中的小写字母开头(并使用下划线而不是骆驼套管) - 因为常量必须以大写字母开头,这样可以避免歧义。您可以使用方法的初始大写字母,但这不是很常见,可能是由于您注意到的括号限制。我曾经看过几次这种情况的一种情况是方法有点像构造函数(例如Float
,CSV
)
答案 1 :(得分:1)
那么,你可以自己检查一下,当你编写Foo
时和执行Foo()
时Ruby解析器会理解什么。
定义如下方法:
def Foo(); 12 ; end
现在试着看看Ruby解析器如何解析它。
require 'ripper'
require 'pp'
pp Ripper.sexp("Foo ")
# => [:program, [[:var_ref, [:@const, "Foo", [1, 0]]]]]
在上面,解析器将Foo
视为常量。但在下文中,它将Foo()
理解为一种方法。
Ripper.sexp("Foo()")
# => [:program, [[:method_add_arg, [:fcall, [:@const, "Foo", [1, 0]]], [:arg_paren, nil]]]]
因此,当我写Foo
时,会出现明确的异常NameError: uninitialized constant Foo
,因为我没有定义像Foo
这样的常量。但是当我写Foo()
时,我会得到12
。只要你想看看,Ruby解析器如何解析任何特定的Ruby代码行,就可以使用这个Ripper库。看:var_ref
和:fcall
。