ruby on rails - Error: Intenta llamar al método privado.
ruby-on-rails access-specifier (3)
Proveniente de una larga historia de sintaxis de estilo C y ahora tratando de aprender Ruby (en Rails), he tenido muchos problemas con sus modismos, pero hoy llegué a uno que no esperaba tener un problema con y no puedo ver lo que sea que debe estar justo delante de mi cara.
Tengo una clase binaria que incluye un método privado para derivar un valor URI de un valor de ruta (uri y ruta son atributos de la clase). Estoy llamando self.get_uri_from_path()
desde Binary.upload()
, pero recibo:
Attempt to call private method
Un fragmento del modelo se ve así:
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
¿Estoy haciendo la llamada incorrectamente? ¿Me estoy perdiendo algo más que es aún más fundamental? El único lugar desde el que se Binary.get_uri_from_path()
en este momento es Binary.upload()
. Espero poder llamar a un método privado desde la misma clase a menos que Ruby haga algo notablemente diferente de otros idiomas que he usado.
Gracias.
Creo que el lenguaje apropiado en este caso no es self.get_uri_from_path () sino simplemente get_uri_from_path (). El yo es redundante. Notas adicionales: * self.path llama al método path en self, que probablemente se define en la clase padre. Si hubiera querido acceder a la variable de instancia directamente, podría haber dicho @path. (@ es el sigilo para las variables de ejemplo). * Los paréntesis para los argumentos de los métodos son opcionales, excepto cuando su ausencia causaría ambigüedad. Usted podría, si lo desea, reemplazar get_uri_from_path () con get_uri_from_path. Esto contrasta con Javascript, donde una función sin parens representa esa función como un valor en lugar de una aplicación de esa función.
No hagas
self.get_uri_from_path()
hacer
get_uri_from_path()
Porque...
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
Sin embargo, hay un diablo donde se puede llamar método privado en cualquier situación, que es:
object.send(:private_method)
Creo que 1.9 tiene una implementación diferente de este truco.