Rails FactoryGirl特征关联模型after_create回调没有设置vanity_url

时间:2016-03-11 21:42:22

标签: ruby-on-rails factory-bot rspec-rails

在我的模型中,我有一个触发方法的after_create回调:

class Job < ActiveRecord::Base
  after_create :update_vanity_url

  private

  def update_vanity_url
    self.vanity_url = '/jobs/' + company.slug + '/' + slug + '/' + id.to_s + '/'
  end
end

这为我的工作设置了一个自定义网址,但是,当我尝试在我的优惠券工厂中使用它时,它没有被保存。优惠券创建时未分配作业。只有在使用优惠券时才会与一份工作配对。我把它称为执行:

FactoryGirl.define do
  factory :coupon do
    code { rand(25**25) }
    percent_discount { rand(100**1) }
    start_at { Time.now }
    end_at { 30.day.from_now }

    trait :executed do |c|
      association :job, factory: [:job, :purchased] 
      c.executed_at { Time.now }
    end
  end
end

理想情况下,我希望能够调用FactoryGirl.create(:coupon, :executed)哪个有效,但是after_create从未被调用过......想法?

此设置的更多详细信息请参见Rails FactoryGirl Factory with optional model association

下面的每个问题评论,我添加了我的路线部分和更新:

路线

  resources :jobs, only: [:new] do
    collection do
      post 'new', to: 'jobs#create'
    end
    get '/review', to: 'reviews#new'
    patch '/review', to: 'reviews#update'
    get '/payment', to: 'payments#new'
    patch '/payment', to: 'payments#update'
  end
  match '/jobs/:company_slug/:job_slug/:id', via: :get, to: 'jobs#show'

2 个答案:

答案 0 :(得分:0)

我研究了几个小时,这就是我发现的工作。事实证明这不是FactoryGirl,而是模型本身...我认为......

  def update_vanity_url
    self.vanity_url = '/jobs/' + company.slug + '/' + slug + '/' + id.to_s + '/'
    save
  end

答案 1 :(得分:0)

您的实际问题

您提出的问题更多是您查找方式的症状或副作用。

tl; dr :未保存vanity_url属性,因为当{1}}回调设置update_vanity_url时,记录已写入数据库。 将其设置在内存中,这就是为什么您的测试可能会因此被绊倒。

这就是为什么在回调中添加after_create会解决您的问题。它只是在创建后第二次保存save。这是必要的,因为在将Job写入数据库之前,您不会拥有id

也许是更好的解决方案?

除了路由到vanity_url属性之外,您是否正在执行任何操作?我问,因为除非你为了速度对其进行非规范化处理,否则根本不需要将它存储在模型上。

我唯一想到的是你可能正在使用这些参数来构造vanity_url并执行类似@job = Job.where(vanity_url: vanity_url).first之类的东西。