Ruby on rails 创建回调后Rails FactoryGirl特质与模型的关联未设置url

Ruby on rails 创建回调后Rails FactoryGirl特质与模型的关联未设置url,ruby-on-rails,factory-bot,rspec-rails,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 理想情况下,我希望能够调用FactoryG

在我的模型中,我有一个触发该方法的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.create(:优惠券,:执行)
,它可以正常工作,但永远不会调用after\u create。。。想法

有关此设置的更多详细信息,请参见此处

根据以下问题评论,我已添加我的路线部分和更新:

路线

  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'

我研究了几个小时,这就是我发现的工作。原来不是工厂女孩,而是模特本身。。。我想

  def update_vanity_url
    self.vanity_url = '/jobs/' + company.slug + '/' + slug + '/' + id.to_s + '/'
    save
  end
你真正的问题 你所问的问题更多的是你如何进行查找的症状或副作用

tl;dr:未保存
VALITY\u url
属性,因为当记录已写入数据库时,
update\u VALITY\u url
在创建后的
回调上设置。它是在内存中设置的,这就是为什么您的测试可能会被这个错误绊倒的原因

这就是为什么在回调中放入
save
可以解决您的问题。它只是在创建一个
作业后第二次保存它。这是必要的,因为在将
id
写入数据库之前,您不需要它

也许有更好的解决办法? 除了路由到该url之外,您是否还使用了
虚荣url
属性?我这样问是因为除非你为了速度而去规范化,否则你可能根本不需要把它存储在模型上


我想到的唯一一件事是,您可能正在使用这些参数来构造
虚荣url
,并执行类似于
@job=job.where(虚荣url:Vantary\url)的操作。首先是
之类的操作。

我会重新考虑这种方法。您的模型不应负责路由。相反,这应该在routes.rb文件中处理。你想要在你的模型中有一个“.find_by_id_或_slug”方法。我尝试过这种方法,但虚荣URL似乎在客户端SEO规范中工作得更好。看看我发布的路线,它在匹配部分@max之外的所有其他方面都像普通的rails一样工作
  def update_vanity_url
    self.vanity_url = '/jobs/' + company.slug + '/' + slug + '/' + id.to_s + '/'
    save
  end