Я знаю, что это основной вопрос, но там так много запутанной, устаревшей и противоречивой информации ... Мне удалось взломать мой мозг ... Как лучше получить доступ к родительской модели из спецификации контроллера ребенка ... с помощью FactoryGirl?
Может быть частично , связанным с использованием значения из родительской модели (user.name) в (to_params) дочернего элемента. Это работает нормально для меня. Я просто испытываю трудности с тестированием:
Псевдо модели:
User
:name - string - unique
:email - string - unique
has_many :ballots
Ballot
belongs_to :user
has_many :items
def to_param #
"#{id} #{user.name}".parameterize
end
factories.rb:
FactoryGirl.define do
sequence :email do |n|
"person#{n}@fake_mail.com"
end
sequence :name do |n|
"Person#{n}"
end
factory :user do
name "Joe Schmo"
email
end
factory :sequenced_user, :parent => :user do
name
email
end
factory :ballot do
sequenced_user
end
ballots_controller_spec.rb:
describe BallotsController do
def valid_attributes
FactoryGirl.attributes_for(:ballot)
end
describe "GET show" do
it "assigns the requested ballot as @ballot" do
ballot = Ballot.create! valid_attributes
get :show, {:id => ballot.to_param}, valid_session
assigns(:ballot).should eq(ballot)
end
end
...
end
ошибка спецификации:
1) BallotsController GET show assigns the requested ballot as @ballot
Failure/Error: get :show, {:id => ballot.to_param}, valid_session
NoMethodError:
undefined method `name' for nil:NilClass
# ./app/models/ballot.rb:5:in `to_param'
# ./spec/controllers/ballots_controller_spec.rb:53:in `block (3 levels) in <top (required)>'
...
Проблема, по-видимому, в том, что действующая спецификация не имеет доступа к name
Пользователя, с которым связано голосование. Но на фабрике бюллетеней есть связанный пользователь!?! Итак, как правильно создать эти отношения с помощью FactoryGirl?