2015-09-11 17 views
8

Un esempio di controller Rails che definisce un metodo privato:metodi privati ​​in Ruby

class ApplicationController < ActionController::Base 
    private 
    def authorization_method 
    # do something 
    end 
end 

Poi, è in uso in una sottoclasse di ApplicationController:

class CustomerController < ApplicatioController 
    before_action :authorization_method 

    # controller actions 
end 

Come è possibile che un privato il metodo è chiamato dalla sua sottoclasse? Qual è il significato di private in Ruby?

+0

possibile duplicato di [Metodi protetti e privati ​​in Rails] (http://stackoverflow.com/questions/4495078/protected-and-private-methods-in-rails) – danielrsmith

+0

Possibile duplicato di [Perché Ruby dispone di entrambi i private e metodi protetti?] (http://stackoverflow.com/questions/3534449/why-does-ruby-have-both-private-and-protected-methods) – Nakilon

risposta

13

Non è possibile chiamare metodi privati ​​con un destinatario esplicito. Ma possono essere chiamati da qualsiasi sottoclasse e istanza della classe.

Here è una bella spiegazione dei metodi public, protected e private in Ruby.

5

Cosa private fa in Ruby, a differenza di altre lingue, è fare in modo che i metodi possono non essere chiamati con ricevitore esplicito.

Aka, non è possibile chiamare some_variable.some_private_method o self.some_private_method.

Questo è tutto. Sono ancora ereditati. Puoi leggere di più here.

3

La sottoclasse eredita tutti i metodi e gli attributi dalla superclasse, inclusi i metodi privati. In effetti, si sta chiamando il metodo privato appartenente alla sottoclasse.

Che cosa non si può fare è authorization_method chiamata dall'esterno ApplicationController (o sottoclassi di controllo Autorizzazione Prova questo nella console:.

> ApplicationController.new.authorization_method 
# NoMethodError: protected method `authorization_method' called for #<ApplicationController:0x0000000bb65778> 
2

Come Daniel tale informazione nella his response metodo privato "non può essere chiamato con un esplicito ricevente". In altre parole, non è possibile chiamare il metodo privata utilizzando 'la notazione punto'. Questo è diverso da Java, dove è possibile chiamare this.privateMethod(). In Ruby self.private_method fallisce, ma si può chiamare come private_method invece.

ma c'è un altro modo di chiamare metodi privati ​​di qualsiasi oggetto, che Rails utilizza internamente per chiamare le azioni prima/dopo.

Se si dispone di un'istanza obj con privata private_method, è possibile richiamare il metodo con:

obj.send :private_method 

La realtà è, non ci sono metodi privati ​​in Ruby in senso stretto. La privacy è "solo raccomandazione, non la regola".

Problemi correlati