Подтвердить что ты не робот

Индивидуально: 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

4b9b3361

Ответ 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