如何获取具有 has_and_belongs_to_many 关联的 FactoryGirl 模型属性?
How to get FactoryGirl model attributes with has_and_belongs_to_many association?
我正在尝试通过 HABTM 关联 :countries
获得 FactoryGirl.attributes_for(:trip)
,因为控制器测试失败 - :countries
在 :trip
属性中不存在):
旅行控制器:
class TripsController < ApplicationController
def create
trip = Trip.new(create_params)
if trip.save
redirect_to trips_path, notice: 'Trip successfully created.'
else
redirect_to :back, alert: trip.errors.full_messages.join('<br>').html_safe
end
end
def create_params
params.require(:trip).permit(:end_date, :description, country_ids: [], countries: [])
end
end
RSpec TripsController 测试:
describe TripsController do
describe 'POST #create' do
before { post :create, trip: attributes_for(:trip) }
it { is_expected.to redirect_to trips_path }
end
end
行程模型:
class Trip < ActiveRecord::Base
# Associations
has_and_belongs_to_many :countries
#Validations
validate :require_at_least_one_country
private
def require_at_least_one_country
if country_ids.empty? && countries.count == 0
errors.add(:base, 'Please select at least one country')
end
end
end
旅行工厂:
FactoryGirl.define do
factory :trip do
description { Faker::Lorem.sentence }
end_date { DateTime.now + 1.day }
after(:build) do |trip, evaluator|
trip.countries << FactoryGirl.create(:country, :with_currencies)
end
end
end
宝石文件:
factory_girl_rails (4.5.0)
试过这个:http://makandracards.com/jan0sch/11111-rails-factorygirl-and-has_and_belongs_to_many,但没用。
检查您是否真的在请求中发送了 countries_ids
。
请用 attributes_for(:trip)
的值更新您的 post。
这里是带解释的答案:
FactoryGirl.define do
factory :trip do
description { Faker::Lorem.sentence }
end_date { DateTime.now + 1.day }
after(:build) do |trip, evaluator|
trip.countries << FactoryGirl.create(:country, :with_currencies)
end
end
end
FactoryGirl.attributes_for(:trip)
returns
{
:description=>"Eum alias tenetur odit voluptatibus inventore qui nobis.",
:end_date=>Wed, 16 Sep 2015 11:48:28 +0300
}
.
FactoryGirl.define do
factory :trip do
description { Faker::Lorem.sentence }
end_date { DateTime.now + 1.day }
country_ids { [FactoryGirl.create(:country, :with_currencies).id] }
end
end
FactoryGirl.attributes_for(:trip)
returns
{
:description=>"Assumenda sapiente pariatur facilis et architecto in.",
:end_date=>Wed, 16 Sep 2015 11:45:22 +0300,
:country_ids=>[4]
}
我正在尝试通过 HABTM 关联 :countries
获得 FactoryGirl.attributes_for(:trip)
,因为控制器测试失败 - :countries
在 :trip
属性中不存在):
旅行控制器:
class TripsController < ApplicationController
def create
trip = Trip.new(create_params)
if trip.save
redirect_to trips_path, notice: 'Trip successfully created.'
else
redirect_to :back, alert: trip.errors.full_messages.join('<br>').html_safe
end
end
def create_params
params.require(:trip).permit(:end_date, :description, country_ids: [], countries: [])
end
end
RSpec TripsController 测试:
describe TripsController do
describe 'POST #create' do
before { post :create, trip: attributes_for(:trip) }
it { is_expected.to redirect_to trips_path }
end
end
行程模型:
class Trip < ActiveRecord::Base
# Associations
has_and_belongs_to_many :countries
#Validations
validate :require_at_least_one_country
private
def require_at_least_one_country
if country_ids.empty? && countries.count == 0
errors.add(:base, 'Please select at least one country')
end
end
end
旅行工厂:
FactoryGirl.define do
factory :trip do
description { Faker::Lorem.sentence }
end_date { DateTime.now + 1.day }
after(:build) do |trip, evaluator|
trip.countries << FactoryGirl.create(:country, :with_currencies)
end
end
end
宝石文件:
factory_girl_rails (4.5.0)
试过这个:http://makandracards.com/jan0sch/11111-rails-factorygirl-and-has_and_belongs_to_many,但没用。
检查您是否真的在请求中发送了 countries_ids
。
请用 attributes_for(:trip)
的值更新您的 post。
这里是带解释的答案:
FactoryGirl.define do
factory :trip do
description { Faker::Lorem.sentence }
end_date { DateTime.now + 1.day }
after(:build) do |trip, evaluator|
trip.countries << FactoryGirl.create(:country, :with_currencies)
end
end
end
FactoryGirl.attributes_for(:trip)
returns
{
:description=>"Eum alias tenetur odit voluptatibus inventore qui nobis.",
:end_date=>Wed, 16 Sep 2015 11:48:28 +0300
}
.
FactoryGirl.define do
factory :trip do
description { Faker::Lorem.sentence }
end_date { DateTime.now + 1.day }
country_ids { [FactoryGirl.create(:country, :with_currencies).id] }
end
end
FactoryGirl.attributes_for(:trip)
returns
{
:description=>"Assumenda sapiente pariatur facilis et architecto in.",
:end_date=>Wed, 16 Sep 2015 11:45:22 +0300,
:country_ids=>[4]
}