Использование метода в seed.rb в Ruby On Rails

Я пытаюсь добавить метод в свой файл seeds.rb, чтобы мне не приходилось писать кучу многословного кода. Однако, в зависимости от размещения метода create_deliverable, я получаю одно из двух сообщений об ошибке при запуске db:setup.

Когда метод перед вызовом

рейк прерван! закрытый метод create_deliverable, вызываемый для #

Когда метод после вызова

рейк прерван! неопределенный метод create_deliverable для #

Нельзя ли использовать методы в seeds.rb? Я как-то неправильно вызываю метод (я пробовал вызывать с self. и без него)?

Метод

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

Код вызова

@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

person ahsteele    schedule 17.11.2009    source источник


Ответы (3)


Мне кажется, что вы поместили свой метод create_deliverable после модификатора доступа private в свой сценарий. Поместите его после public.

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
person Alex Polkhovsky    schedule 17.11.2009
comment
seed.rb не определяет никаких классов, так что публичные и приватные значения не имеют. Важно то, что вы определяете метод перед его выполнением. - person Ramsy de Vos; 17.08.2017

Убедитесь, что вы определили метод перед его вызовом:

def test_method
  puts "Hello!"
end

test_method
person Joe Stepowski    schedule 23.07.2015
comment
На самом деле это лучший ответ, потому что seed.rb не определяет класс, поэтому открытые/закрытые методы не имеют значения. - person Ramsy de Vos; 17.08.2017

Если вы собираетесь использовать self., используйте его в определении метода, а не в вызове.

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

Насколько я понимаю, файлы .rb без определения класса оборачиваются в анонимный рубиновый класс при запуске, поэтому определение метода для себя должно работать нормально.

person localshred    schedule 17.11.2009
comment
+1 за объяснение того, как .rb файлы без определения класса заворачиваются в анонимный рубиновый класс - person ahsteele; 17.11.2009