前置き: validation_context とは
避けたい validation
がある時など、validation
の条件に validation_context
を利用し、
app/model/user.rb
class User < ApplicationRecord
before_validation :set_bar, unless: -> { validation_context == :hoge }
# ...
end
save
時に、context
を指定してあげれば、validation
を避けられます。
app/controller/user/user_controller.rb
class User::UsersController < User::ApplicationController
def create
@user = User.new(user_params)
@user.save(context: :hoge)
# ...
end
# ...
end
ただ、この動作を FactoryBot
だとどうすれば良いのか分からなかったので、書いときます。
本題: FactoryBot での context 指定
結論としては to_create
を使えばできます!
例えば、to_create
で context
を指定して save
する trait
を作成して、
spec/factories/users.rb
FactoryBot.define do
factory :user do
trait :context_hoge do
to_create { |instance| instance.save(context: :hoge) }
end
# ...
end
end
create
時に指定すると、作成した trait
を指定すると、上手くいきます。
spec/requests/user/users_controller_spec.rb
RSpec.describe User::UsersController, type: :request do
let!(:user) { create(:user, :context_hoge) }
# ...
end
余談
validation_context
は以下の記事のようなハマりどころもあるので、使わないで済むなら、使いたく無いなぁ。