2016-10-26 2 views
3

Рассмотрим следующие настройки модельнуюКак передать атрибуты ассоциации через черту в factorygirl?

class Template < ActiveRecord::Base 
    belongs_to :detail, polymorphic: true, dependent: :destroy 
    accepts_nested_attributes_for :detail 
end 

class EbayTitleTemplate < ActiveRecord::Base 
    has_one :template, as: :detail 
end 

А вот действующий завод

FactoryGirl.define do 
    factory :template do 
    merchant 
    channel 

    trait :ebay_title do 
    association :detail, factory: :template_ebay_title 
    end 

    factory :ebay_title_template, traits: [:ebay_title] 
    end 

    factory :template_ebay_title, class: EbayTitleTemplate do 
    name  "eBay Title Template" 
    title  "Super Cool Hat" 
    sub_title "Keeps the sun away" 
    description "The best hat available!" 
    end 
end 

Следующие работы для меня

create(:ebay_title_template) # creates both records, creating a new Merchant and Channel for me 
create(:ebay_title_template, merchant: Merchant.first, channel: Channel.first) # creates both records with explicit channel and merchant 

Теперь то, что я хотел бы также сделать, это пропуск в пользовательских атрибутах для переопределения значений по умолчанию. Что-то вроде этого:

create(:ebay_title_template, title: "Overwrite the title", sub_title: "Overwrite the subtitle") 

Что в итоге происходит то, что я получаю ошибку ArgumentError: Trait not registered: title

Как-то FactoryGirl думает, что я передаю в черте или шаблон завод не распознает title как атрибут.

Я попытался с помощью переходных процессов, чтобы пользовательские арг пройти через шаблон и с помощью обратного вызова в :template_ebay_title завода, чтобы отобразить атрибут в столбце модели следующим образом:

transient do 
    custom_args nil 
end 

after(:create) do |record, evaluator| 
    evaluator.custom_args.each do |key, value| 
    record.key = value 
    end 
end 

А потом я создаю как это:

create(:ebay_title_template, custom_args: {title: "Overwrite", sub_title: "Overwrite"}) 

Это приводит к ошибке NoMethodError: undefined method custom_args' для # `

Так как есть способ д o это, и я делаю это неправильно, или мне нужен совершенно новый подход. Имейте в виду, что будут десятки ассоциаций, которые нужно будет определить как черты (или что-то еще), поэтому я не могу назначить конкретные переходные процессы.

Как я могу достичь своей цели создания фабрики, которая создает родительскую и полиморфную связь, позволяя мне передавать произвольные атрибуты для полиморфной ассоциации и возвращать родительский объект?

+0

какая версия FactoryGirl вы используете? По-видимому, до 5.0 вам нужно использовать 'ignore' вместо' transient' - source: [неопределенные методы для переменных переходных процессов factorygirl] (http://stackoverflow.com/questions/25510268/undefined-methods-for-factorygirl-transient -переменные) – David

+0

Я использую factory_girl_rails 4.5. Я попробовал «игнорировать» вместо «переходного» и получил ту же ошибку. – cheeseandpepper

ответ

1

Если вы желаете, чтобы передать значения в пределах одного значения хэш-функции, вы должны передать их следующим образом:

create(:ebay_title_template, custom_args: {title: "Overwrite the title", sub_title: "Overwrite the subtitle"}) 

В противном случае вы можете создать новые временные значения, и передать их так, как вы передаете их теперь:

transient do  # use ignore with FactoryGirl/FactoryBot < v4.7 
    title nil 
    sub_title nil 
end 

При добавлении нескольких атрибутов, как выше вы можете перебрать переменный переопределяет экземпляр оценщика:

evaluator.instance_variable_get(:@overrides).each do |key, value| 
    puts key, value 
end 

Надеюсь, что это поможет!

Смежные вопросы