我是一名初学者,并试图在模型中加入一些代码。下面的代码就是一个例子。
查看:
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 :(得分: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
这会动态调用您对象上的lefthandstats
和righthandstats
方法。
答案 3 :(得分:0)
首先通过将//
替换为#
来更正您的代码,因为我们会使用#
来评论akofink提到的代码。
然后在代码的上下文中考虑这个:
@result = Player.all
@result.each do |player|
player.name
end
此处@result
正在返回一系列玩家。所以你可以使用@result.each
的循环,这样每个结果作为玩家,你就得到了每个玩家的名字。
使用上述内容的知识纠正您的代码。