2013-02-27 78 views
0

我是一名rails初学者,并试图在模型中添加一些代码。下面的代码是一个例子。rails迭代方法数组undefined方法

查看:

Player_stats: <%= @player.player_pass_completion_ratio %> 

型号:

class Player < ActiveRecord::Base 
has_many :lefthandstats 
has_many :righthandstats 

def player_pass_completion_ratio 
Hands = [ lefthandstats, righthandstats] #These are objects & calling @player.lefthandstats.find_with_passes directly generally works 

if self.category == "Hands" 
    total_usual_passes = 500 
    Hands.each do |cmethod| 
    if self.cmethod.find_with_passes(:passes, :first, {:conditions => 'passes>200' }) then accuratestats += 1 end 
    end 
end 

accuracy = (accuratestats/total_usual_passes)*100 
end 

我得到一个未定义的方法 “cmethod” 当我尝试调用视图中的代码。任何意见是极大的赞赏。

+0

在该方法的第一行,这似乎是说,你要在一个名为Hands的数组中放置两个局部变量名称'lefthandstats'和'righthandstats'。但是,由于这是该方法的第一行,因此这两个变量尚未定义,因此它们为零。 – GSP 2013-02-27 14:19:34

回答

1

您的代码调用self.cmethod,它会尝试打电话给你的对象上cmethod方法(不存在)。

我相信你正在试图做的是类似如下:

hands = [:lefthandstats, :righthandstats] 
hands.each do |cmethod| 
    self.send(cmethod).... #rest of your code goes here 
end 

这将动态调用的对象上lefthandstatsrighthandstats方法。

+0

感谢您的输入! – 2013-02-27 16:04:55

1

摆脱“self.cmethod”的,只是用“cmethod”

if cmethod.find_with_passes.... 

在块“cmethod”的范围仅仅是一个局部变量。通过把自己放在它前面,ruby假定你正在调用包含类实例的方法。

+0

感谢您的输入。我把它取下来,现在得到'未定义的方法'/'为零:NilClass'。按照我实施的方式在块中传递方法是否可行? – 2013-02-27 14:12:14

+0

我看的越多,所写的代码就无法工作。你在一个名为'Hands'的数组中有两个'somethings'。为了完成这项工作,你调用'find_with_passes'的'东西'必须定义该方法。你说'lefthandstat'是一个对象。什么类型的对象? – GSP 2013-02-27 14:16:28

+0

顺便说一下,'undedeinfed方法nil:NilClass'是因为“Hands”数组中的对象为零。 – GSP 2013-02-27 14:17:53

2

评论红宝石使用#字符,而不是//

+0

虽然这是真的,但它不回答问题。 – sevenseacat 2013-02-27 14:11:51

0

首先通过将//替换为#来更正您的代码,如在rails中我们使用#来评论akofink所述的代码。

然后考虑这在你的代码的情况下:

@result = Player.all 

@result.each do |player| 

player.name 

end 

这里@result正在恢复的球员的集合。所以你可以使用@result.each这样的循环,这样对于每个玩家的结果,你都会得到每个玩家的名字。

用上面的知识修正你的代码。