2012-02-29 29 views
13

得到了一對一的關係問題一對一:未定義的方法版本

我有一些比賽,我想有一個比賽的比分。

我Match.rb

has_one :score, :dependent => :destroy 

我score.rb

belongs_to :match 

我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 

我的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 

,我沒有使用一對一的關係,到目前爲止,因爲我很新的努力的回報率,有什麼建議麼?

編輯

編輯我的代碼以匹配create_score和build_score,似乎工作。但現在我有一些奇怪的行爲。

我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是零

+0

創造得分既然你設置'@score = ...'控制器,你可以這樣做:'的form_for([@比賽,@得分])' – 2012-02-29 19:12:12

+0

謝謝,但這個設置是暫時的,不會永遠呆在那裏;)但是,謝謝你的建議。 – cschaeffler 2012-02-29 23:03:26

回答

23

使用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 

Docs for This:http://guides.rubyonrails.org/association_basics.html#belongs_to-create_association

+0

仍然無法正常工作。 – 2012-02-29 12:03:36

+0

@RyanBigg,我有一個錯字。修復。 – 2012-02-29 12:04:42

+0

很好的答案,謝謝。 – 2012-02-29 13:42:31

7

您應該做match.build_score。這是因爲當你調用score方法時,它會嘗試獲取關聯,並且因爲它尚未定義,它將返回nil。然後你撥打buildnil,這就是爲什麼它爆炸。

has_many關聯方法返回一種「代理」對象到對它們的調用返回的對象,所以這就是爲什麼像posts.comments.build這樣的工作。 belongs_tohas_one關聯的方法試圖直接取回關聯,因此您需要執行build_association而不是association.build

5

您可以通過使用下面的示例

@match.build_score 
or 
@match.create_score 
+2

尼斯小投票環你已經在這裏... – 2012-02-29 13:41:47

+0

你的意思是投票ring @Ryan Bigg? – sangeethkumar 2012-03-02 12:15:47