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

时间:2015-03-22 15:53:47

标签: ruby-on-rails ruby gem

我创建了一个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

辅助模块包含我的方法。

2 个答案:

答案 0 :(得分:2)

如果没有括号,ruby认为你引用的是常量JeuxDuLoto_drawing而不是相同名称的方法。

方法通常以ruby中的小写字母开头(并使用下划线而不是骆驼套管) - 因为常量必须以大写字母开头,这样可以避免歧义。您可以使用方法的初始大写字母,但这不是很常见,可能是由于您注意到的括号限制。我曾经看过几次这种情况的一种情况是方法有点像构造函数(例如FloatCSV

答案 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