当迭代方法数组时,rails undefined方法

时间:2013-02-27 14:06:27

标签: ruby-on-rails ruby-on-rails-3

我是一名初学者,并试图在模型中加入一些代码。下面的代码就是一个例子。

查看:

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”。非常感谢任何建议。

4 个答案:

答案 0 :(得分:2)

ruby​​中的注释使用#字符,而不是//

答案 1 :(得分:1)

摆脱“self.cmethod”并使用“cmethod”

if cmethod.find_with_passes....

在块的范围内,“cmethod”只是一个局部变量。通过将self置于其前面,ruby假设您正在调用包含类实例的方法。

答案 2 :(得分:1)

您的代码正在调用self.cmethod,它将尝试在您的对象上调用cmethod方法(该方法不存在)。

我相信你要做的事情如下:

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

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

答案 3 :(得分:0)

首先通过将//替换为#来更正您的代码,因为我们会使用#来评论akofink提到的代码。

然后在代码的上下文中考虑这个:

@result = Player.all

@result.each do |player|

player.name

end

此处@result正在返回一系列玩家。所以你可以使用@result.each的循环,这样每个结果作为玩家,你就得到了每个玩家的名字。

使用上述内容的知识纠正您的代码。