2015-09-14 84 views
3

我试图让FactoryGirl.attributes_for(:trip)与HABTM协会:countries因为控制器测试失败 - :countries缺席在:trip属性):如何使用has_and_belongs_to_many关联获取FactoryGirl模型属性?

TripsController:

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 

的Gemfile:

factory_girl_rails (4.5.0) 

尝试这样:http://makandracards.com/jan0sch/11111-rails-factorygirl-and-has_and_belongs_to_many,但没用。

+0

我曾经尝试使用has_and_belongs_to_many为多对多的,但用来运行到各种问题。我发现使用has_many更容易设置。本教程可能有所帮助:http://blog.teamtreehouse.com/what-is-a-has_many-through-association-in-ruby-on-rails-treehouse-quick-tip – RichardAE

回答

2

下面是解释了答案:

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)回报

{ 
    :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)回报

{ 
    :description=>"Assumenda sapiente pariatur facilis et architecto in.", 
    :end_date=>Wed, 16 Sep 2015 11:45:22 +0300, 
    :country_ids=>[4] 
} 
0

检查您是否确实在您的请求中发送任何countries_ids

请更新您的帖子,其值为attributes_for(:trip)

+0

嗨Alexey,问题不在控制器中,但在FactoryGirl.attributes_for –

+0

嗨,其实我的意思是说你不会在这行代码中发送'countries_ids':'之前{post:create,trip:attributes_for(:trip)}',但我还不确定。很高兴你已经解决它自己。 –

相关问题