Индивидуально: Undefined метод сборки
возникла проблема с отношениями один к одному
У меня есть несколько матчи, и я хочу иметь один балл для матча.
my Match.rb
has_one :score, :dependent => :destroy
мой счет .rb
belongs_to :match
my scores_controller.rb
def new
@match = Match.find(params[:match_id])
@score = @match.score.new
end
def create
@match = Match.find(params[:match_id])
@score = @match.score.create(params[:score])
end
my routes.rb
resources :matches do
resources :scores
end
мои оценки /new.html.haml
= form_for([@match, @match.score.build]) do |f|
= f.label :score1
= f.text_field :score1
%br
= f.label :score2
=f.text_field :score2
%br
= f.submit
моя ошибка, что я получаю
undefined method `new' for nil:NilClass
Я пока не работал с отношениями один к одному, так как я довольно новичок в RoR, любые предложения?
ИЗМЕНИТЬ
отредактировал мой код для соответствия create_score и build_score, похоже, работает. но теперь у меня есть странное поведение.
в моем счете .rb
attr_accessible :score1, :score2
но когда я пытаюсь вызвать в своих матчах /show.html.haml
= @match.score.score1
Я получаю неизвестный вызов метода, или я вообще ничего не вижу... но если я просто позвоню
= @match.score
Я получаю возвращаемый объект оценки (например, #) #
РЕДАКТИРОВАТЬ 2
Задача Fix'd. Я звонил
оценки/new.haml.html
= form_for([@match, @match.create_score])
должно быть
= form_for([@match, @match.build_score])
все работает по назначению.
необходимо войти в консоль рельсов и получить эти объекты, чтобы увидеть каждый: score1: score2 was nil
Ответы
Ответ 1
Используйте build
вместо new
:
def new
@match = Match.find(params[:match_id])
@score = @match.build_score
end
Вот документы для этого: http://guides.rubyonrails.org/association_basics.html#belongs_to-build_association
Аналогично, в методе create сделайте это так:
def create
@match = Match.find(params[:match_id])
@score = @match.create_score(params[:score])
end
Документы для этого: http://guides.rubyonrails.org/association_basics.html#belongs_to-create_association
Ответ 2
Вы должны делать match.build_score
. Это связано с тем, что когда вы вызываете метод score
, он пытается получить ассоциацию, и поскольку он еще не определен, он вернет nil
. Затем вы вызываете build
на nil
и то, почему он взрывается.
has_many
методы ассоциации возвращают своего рода объект "прокси" к объектам, возвращаемым вызовами к ним, поэтому вот почему такие вещи, как posts.comments.build
, работают. Методы ассоциаций belongs_to
и has_one
пытаются получить ассоциации сразу, поэтому вам нужно сделать build_association
, а не association.build
.
Ответ 3
Вы можете создать счет, используя приведенный ниже пример
@match.build_score
or
@match.create_score