0

我是一名 Rails 初学者,并试图在模型中添加一些代码。下面的代码是一个插图。

看法:

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

4 回答 4

2

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

于 2013-02-27T14:09:50.670 回答
1

摆脱“self.cmethod”,只使用“cmethod”

if cmethod.find_with_passes....

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

于 2013-02-27T14:09:22.597 回答
1

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

我相信您正在尝试做的事情如下:

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

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

于 2013-02-27T14:11:04.740 回答
0

首先更正您的代码,方法是替换//#我们#用来注释 akofink 提到的代码的rails。

然后在您的代码上下文中考虑这一点:

@result = Player.all

@result.each do |player|

player.name

end

@result是返回的玩家集合。所以你可以使用一个循环,@result.each这样对于作为玩家的每个结果,你都会得到每个玩家的名字。

了解以上内容,更正您的代码。

于 2013-02-27T14:15:12.633 回答