为什么我的动作视图方法使用括号而不是没有它?
Why does my action view method work with parentheses and not without it?
我创建了一个 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
辅助模块包含我的方法。
没有括号,ruby 认为您引用的是常量 JeuxDuLoto_drawing
而不是同名方法。
方法通常在 ruby 中以小写字母开头(并使用下划线而不是驼峰式大小写)- 因为常量必须以大写字母开头,这避免了歧义。您可以为方法使用首字母大写字母,但这不是很常见,可能是由于您注意到的括号限制。我见过几次这种情况的一种情况是行为有点像构造函数的方法(例如 Float
、CSV
)
好吧,你可以自己检查一下,Ruby 解析器在你写 Foo
和你写 Foo()
.
时理解什么
定义一个方法如下:
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
。使用这个 Ripper lib whenever you want to see, how Ruby parser parse any specific line of Ruby code. Look :var_ref
and :fcall
.
我创建了一个 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
辅助模块包含我的方法。
没有括号,ruby 认为您引用的是常量 JeuxDuLoto_drawing
而不是同名方法。
方法通常在 ruby 中以小写字母开头(并使用下划线而不是驼峰式大小写)- 因为常量必须以大写字母开头,这避免了歧义。您可以为方法使用首字母大写字母,但这不是很常见,可能是由于您注意到的括号限制。我见过几次这种情况的一种情况是行为有点像构造函数的方法(例如 Float
、CSV
)
好吧,你可以自己检查一下,Ruby 解析器在你写 Foo
和你写 Foo()
.
定义一个方法如下:
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
。使用这个 Ripper lib whenever you want to see, how Ruby parser parse any specific line of Ruby code. Look :var_ref
and :fcall
.