为什么我的动作视图方法使用括号而不是没有它?

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 中以小写字母开头(并使用下划线而不是驼峰式大小写)- 因为常量必须以大写字母开头,这避免了歧义。您可以为方法使用首字母大写字母,但这不是很常见,可能是由于您注意到的括号限制。我见过几次这种情况的一种情况是行为有点像构造函数的方法(例如 FloatCSV

好吧,你可以自己检查一下,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.