2009-11-17 21 views
9

Estoy tratando de agregar un método a mi seeds.rb para que no tenga que escribir un montón de código detallado. Sin embargo, dependiendo de la ubicación del método create_deliverable, recibo uno de los dos mensajes de error al ejecutar db:setup.Usando un método en seeds.rb en Ruby On Rails

Cuando método es antes de la llamada

rastrillo abortado! método privado 'create_deliverable' pidió #

Cuando método es después de la llamada

rastrillo abortado! método no definido `create_deliverable' para #

¿No es posible que utiliza métodos de seeds.rb? ¿De alguna manera estoy llamando al método incorrectamente (he intentado llamar con y sin el self.)?

Método

def create_deliverable(complexity, project_phase_id, deliverable_type_id) 
    Deliverable.create(:name => (0...8).map{65.+(rand(25)).chr}.join, 
     :size => 2 + rand(6) + rand(6), 
     :rate => 2 + rand(6) + rand(6), 
     :deliverable_type_id => deliverable_type_id, 
     :project_phase_id => project_phase_id, 
     :complexity => complexity) 
end 

Llamar código

@wf_project.project_phases.each do |phase| 
    DeliverableType.find_by_lifecycle_phase(phase.lifecycle_phase_id).each do 
    |type| 
    self.create_deliverable("Low", type.id, phase.id) 

    self.create_deliverable("Medium", type.id, phase.id) 

    self.create_deliverable("High", type.id, phase.id) 
    end 
end 

Respuesta

5

Me parece que ha colocado su método create_deliverable después del modificador de acceso "privado" en su secuencia de comandos. Ponlo después de público.

public 

    def create_deliverable(complexity, project_phase_id, deliverable_type_id) 
     Deliverable.create(:name => (0...8).map{65.+(rand(25)).chr}.join, 
      :size => 2 + rand(6) + rand(6), 
      :rate => 2 + rand(6) + rand(6), 
      :deliverable_type_id => deliverable_type_id, 
      :project_phase_id => project_phase_id, 
      :complexity => complexity) 
    end 
private # to keep the rest of methods private 
+0

seeds.rb no define ninguna clase, por lo tanto, público y privado no importa. Lo que importa es que defina el método antes de ejecutarlo. –

12

Si usted va a utilizar self., usarlo en la definición del método, no la llamada.

def self.create_deliverable(...) 
    ... 
end 
... 
create_deliverable("Low", type.id, phase.id) 
... 

Es mi entendimiento de que .rb archivos sin necesidad de una definición de clase envolverse en una clase de rubí en el anonimato cuando se ejecutan, por lo que define el método en sí debería funcionar bien.

+5

+1 para la explicación de cómo 'archivos .rb' sin una definición de clase conseguir envuelto en una clase de rubí en el anonimato – ahsteele

+0

Usted es bienvenido . :) – localshred

10

Asegúrese de que define el método antes de llamar a:

def test_method 
    puts "Hello!" 
end 

test_method 
+2

Esta es en realidad una mejor respuesta, porque seeds.rb no define una clase, por lo que los métodos públicos/privados no importan. –