Один-к-одному: неопределенный метод сборки - PullRequest
14 голосов
/ 29 февраля 2012

есть проблема с отношениями один к одному

У меня есть несколько матчей, и я хочу получить один счет за матч.

my Match.rb

has_one :score, :dependent => :destroy

мой счет.рб

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

мои маршруты.рб

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, есть предложения?

EDIT

отредактировал мой код, чтобы он соответствовал create_score и build_score, похоже, работает. но теперь у меня какое-то странное поведение.

в моем счете.rb

attr_accessible :score1, :score2

но когда я пытаюсь вызвать в моих матчах / show.html.haml

= @match.score.score1

я получаю неизвестный вызов метода или вообще ничего не вижу ... но если я просто вызову

= @match.score

я получил объект оценки (например, #) #

РЕДАКТИРОВАТЬ 2

Исправлена ​​проблема. Я звонил

баллов / new.haml.html

= form_for([@match, @match.create_score])

должно быть

= form_for([@match, @match.build_score])

все работает как задумано.

необходимо для входа в консоль рельсов и выборки этих объектов, чтобы увидеть все: Score1: Score2 был ноль

Ответы [ 3 ]

25 голосов
/ 29 февраля 2012

Используйте 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

Аналогично, в методе создания сделайте это следующим образом:

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

8 голосов
/ 29 февраля 2012

Вы должны делать match.build_score.Это связано с тем, что при вызове метода score он будет пытаться получить ассоциацию, а поскольку он еще не определен, он вернет nil.Затем вы вызываете build на nil, и поэтому он взрывается.

has_many методы ассоциации возвращают своего рода «прокси» объект к объектам, возвращаемым их вызовами, поэтому вот почемувроде posts.comments.build работает.Методы для belongs_to и has_one ассоциаций пытаются сразу извлечь ассоциации, поэтому вам нужно сделать build_association вместо association.build.

5 голосов
/ 29 февраля 2012

Вы можете создать счет, используя приведенный ниже пример

@match.build_score
or
@match.create_score
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...