nilclass nil method for ruby module nomethoderror

ruby - nomethoderror undefined method `+'' for nil nilclass



Ruby-Módulo:: NoMethodError (4)

Tengo un módulo como este:

module Prober def probe_invoke(type, data = {}) p = Probe.new({:probe_type => type.to_s, :data => data.to_json, :probe_status => 0, :retries => 0}) p.save end end

Y estoy tratando de acceder a esto desde mi programa principal como este:

require ''prober'' Prober.probe_invoke("send_sms", sms_text)

Pero genera error:

método indefinido `probe_invoke ''para Prober: Module (NoMethodError)


Aparte de las respuestas que te dan la opción de definir la función como self. , tiene otra opción de incluir el módulo y llamarlo sin la referencia del módulo como esta:

module Prober def probe_invoke(type, data = {}) p = Probe.new({:probe_type => type.to_s, :data => data.to_json, :probe_status => 0, :retries => 0}) p.save end end

y puedes llamarlo así:

require ''prober'' include Prober probe_invoke("send_sms", sms_text)


Junto a las respuestas aquí también puedes hacer lo siguiente:

module Prober class << self def probe_invoke(type, data = {}) p = Probe.new({:probe_type => type.to_s, :data => data.to_json, :probe_status => 0, :retries => 0}) p.save end # more module instance methods ... end end

La class << self block definirá también todos los métodos en ella como métodos de instancia de su módulo.

(Su funcionalidad es la misma que para definir cada método individual por def Prober.mymethod ... o def self.mymethod ... )

Actualización (2014-11-22)

De acuerdo con la Guía de estilo de Ruby, debes usar module_function en module_function lugar:

module Prober module_function # <-- preferred style nowadays def probe_invoke(type, data = {}) Probe.new(probe_type: type.to_s, data: data.to_json, probe_status: 0, retries: 0) .save # no need for a temporary variable end # more module methods ... end

Yo llamaría a esto módulos de utilidad .

Por cierto: en el pasado era más común utilizar extend self lugar de envolver los métodos en una class << self block.

También adapté el código anterior a otras recomendaciones de guías de estilo.


La forma más fácil es convertir su método en un método de nivel de módulo:

module Prober def Prober.probe_invoke(type, data = {}) p = Probe.new({:probe_type => type.to_s, :data => data.to_json, :probe_status => 0, :retries => 0}) p.save end end

def self.probe_invoke también funcionaría, porque en el momento en que se ejecuta esa línea, self es la definición del módulo.


La respuesta es:

module Prober def Prober.probe_invoke(type, data = {}) p = Probe.new({:probe_type => type.to_s, :data => data.to_json, :probe_status => 0, :retries => 0}) p.save end end Prober.probe_invoke("send_sms", sms_text)

Porque de lo contrario, define el método como un método de instancia del módulo, pero en realidad desea definirlo de forma estática.