Ruby on rails 创建回调后Rails FactoryGirl特质与模型的关联未设置url
在我的模型中,我有一个触发该方法的after_create回调: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
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