错误:尝试调用私有方法

时间:2009-08-19 16:46:28

标签: ruby-on-rails ruby access-specifier private-methods

来自C风格语法的悠久历史,现在正在尝试学习Ruby(在Rails上),我一直在用它的习语等问题,但是今天我遇到了一个我没想到的问题。有问题,我无法看到任何必须在我面前的东西。

我有一个Binary类,它包含一个从路径值派生URI值的私有方法(uri和path是该类的属性)。我在self.get_uri_from_path()内拨打Binary.upload(),但我得到了:

Attempt to call private method

该模型的片段如下所示:

class Binary < ActiveRecord::Base
  has_one :image

  def upload( uploaded_file, save = false )
    save_as = File.join( self.get_bin_root(), '_tmp', uploaded_file.original_path )

    # write the file to a temporary directory
    # set a few object properties

    self.path   = save_as.sub( Rails.root.to_s + '/', '' )
    self.uri    = self.get_uri_from_path()
  end

  private

  def get_uri_from_path
    return self.path.sub( 'public', '' )
  end
end

我拨打的电话不正确吗?我错过了一些更基本的东西吗?目前Binary.get_uri_from_path()被调用的唯一地方是Binary.upload()。我希望能够在同一个类中调用私有方法,除非Ruby做了与我用过的其他语言明显不同的东西。

感谢。

3 个答案:

答案 0 :(得分:46)

不要做

self.get_uri_from_path()

DO

get_uri_from_path()

由于...

  class AccessPrivate
    def a
    end
    private :a # a is private method

    def accessing_private
      a              # sure! 
      self.a         # nope! private methods cannot be called with an explicit receiver at all, even if that receiver is "self"
      other_object.a # nope, a is private, you can't get it (but if it was protected, you could!)
    end
  end

via

答案 1 :(得分:1)

我认为在这种情况下正确的习惯用法不是self.get_uri_from_path()而是简单的get_uri_from_path()。自我是多余的。附加说明: * self.path调用self上的path方法,这可能是在父类中定义的。如果您想直接访问实例变量,可以说@path。 (@是实例变量的sigil。) *方法参数的括号是可选的,除非它们的缺席会引起歧义。如果您选择,可以将get_uri_from_path()替换为get_uri_from_path。这与Javascript形成对比,其中没有parens的函数将该函数表示为值而不是该函数的应用程序。

答案 2 :(得分:1)

虽然你可以在任何情况下调用私有方法,但是存在一个问题:

object.send(:private_method)

我相信1.9有一个不同的实现这个技巧