2015-09-18 4 views
0

У меня есть метод класса Ruby, и я хочу использовать закрытый метод объекта этого класса, но Rails вызывает ошибку.Invoke private method из класса

Конкретный контекст: у меня есть модель класса Team. I определено

def self.to_csv(**options) 
    # blah blah blah 
    teams = self.all 
    teams.each do |team| 
     csv_row = team.export_as_csv_row #a private method 
     # and it failed here 
    end 
end 

Я использую Ruby 2.2.1 и Rails 4.2. Если я не могу этого сделать, если есть способ защитить export_as_csv_row от других классов, видящих это?

+5

Вы можете использовать 'send', но ... возможно, было бы лучше сделать этот метод общедоступным, поскольку он, по-видимому, предназначен для того, чтобы не быть приватным. –

+0

Я новичок в Ruby, но не является частным методом, доступным для этого класса? или частные, просто доступные только для того же типа? –

+0

@JunchaoGu частные методы не могут быть вызваны с явным приемником, как вы делаете вызов 'team.export_as_csv_row', где' команда' является явным получателем. Есть тонна больших объяснений, что означает «частный» в рубине. [Вот только одна такая статья] (http://devblog.orgsync.com/2013/05/20/private-and-protected-they-might-not-mean-what-you-think-they-mean/) – engineersmnky

ответ

2

Вы можете легко вызвать частные методы любого экземпляра с помощью метода Object#send:

team.send :export_as_csv_row 

Более подробную информацию можно получить в документации Object#send.

+0

При создании ссылок используйте текст, более понятный в тексте, чем «здесь». Дайте людям понять, куда они идут. Это важно как для пользовательского интерфейса, так и для SEO. –

+0

@theTinMan Я заметил ваше редактирование. Спасибо, за указание на это :) – dimakura