Как поместить этот конкретный конструктор в объект FactoryGirl?

Я пытаюсь поместить этот код создания в FactoryGirl.

Итак, в основном здесь, вы можете видеть, что у моего класса User есть метод для создания изображения из его информации, идентификатора, made_at и т. Д.

,

class User 
has_many :pictures

def create_picture
    picture = Picture.new(
        user_id: self.id,
        store_dir: get_user_medias_path,
    )
    picture.save!
    picture
end

def get_user_media_path
   "u/#{self.id}/#{self.created_at}
end


end

тогда я попытался поместить это в объект FactoryGirl, это выглядело следующим образом

FactoryGirl.define do
  factory :user do
    sequence(:name) { |i| "flav_#{i}" }
  end

  factory :picture do
    store_dir user.get_user_medias_path
    remote_url "http://lorempixel.com/600/600/animals/internet#{user.id}/"
    association :user     
  end
end

Но, как и следовало ожидать, он не может найти ни user.id, ни user.method.

Как я могу ссылаться на атрибут пользователя внутри объекта изображения?

Я потерян. Любая помощь будет более чем приветствоваться. знак равно

1 ответ

Решение

В вашем коде user вызывается в контексте определения фабрики, у которого нет такого метода. Вам нужно позвонить user на объекте, фактически строящемся, картина.

Для этого вы должны обернуть вычисленные значения в блоки:

factory :picture do
  store_dir { user.get_user_medias_path }
  remote_url { "http://lorempixel.com/600/600/animals/internet#{user.id}/" }
  association :user     
end

Смотрите ленивые и зависимые атрибуты в документах.

Другие вопросы по тегам