NoMethodError未定义方法`alq' 1:Fixnum

时间:2014-12-04 16:15:46

标签: ruby-on-rails ruby ruby-on-rails-4 nomethoderror

我在轨道上做了新的,这是我的第一个个人应用程序。我使用Prawn-rails生成PDF。

现在,我尝试根据l_answer

中定义的行数添加行

我收到此错误: 考试中的NoMethodError#show - 未定义的方法`alq'代表1:Fixnum

我的虾代码:

@exam.line_questions.each do |q| 

pdf.text "#{q.question.question}"
pdf.move_down(5)
pdf.text "#{q.question.l_answer.alq}"
pdf.move_down(30)

end

我收到错误:pdf.text“#{q.question.l_answer.alq}”

这是我的问题模型类:

class Question < ActiveRecord::Base

DISCIPLINA_TYPE = ["Portugues", "Matematica", "Estudo do Meio"]
ANO_TYPE = ["1º Ano", "2º Ano", "3º Ano", "4º Ano"]

has_reputation :votes, source: :user, aggregated_by: :sum

has_many :line_questions

validates :title , presence:true , uniqueness: true
validates :question, presence:true
validates :disciplina, inclusion: DISCIPLINA_TYPE
validates :ano, inclusion: ANO_TYPE
def alq
  linhas = question.l_answer
  for i in linhas do
    until i <= linhas
      if i = 1 
        "R:________________________________________"
        i +=1
      else
        "__________________________________________"
        i += 1
      end
    end
  end
end

好吧,也许我不能很好地解释自己......

l_answer是类Question的参数。

所以我定义了一个新的问题。

这个问题将有4行回答,所以l_answer = 4

我将我的代码更改为:

def alq(l_answer)
  l = l_answer
  for i in l do
    until i = 0
      if i = 1 
        "R:________________________________________"
        i -=1
      else
        "__________________________________________"
        i -= 1
      end
    end
  end
end

和Prawn pdf文件:

@exam.line_questions.each do |q| 
pdf.text "#{q.question.question}"
pdf.move_down(5)
pdf.text "#{q.question.alq(q.question.l_answer)}"
pdf.move_down(30)

end

但现在我明白了:undefined method `each' for 1:Fixnum!

这更接近吗?

@VitalyKushner 作为旁注,alq和l_answer不是方法的好名字。你不是通过使用较少的符号来保存树木,而是让你更难阅读;) - haahahah这就是noob意味着什么:)。感谢您的输入

2 个答案:

答案 0 :(得分:0)

好吧,似乎q.question.l_answer是一个整数,而不是Question,当然它没有定义alq方法。

作为旁注,alql_answer不是方法的好名字。你不是通过使用较少的符号来保存树,而是使你更难阅读;)

答案 1 :(得分:0)

这里有几个问题。

  • for ...仅适用于集合,而l_answer则不适用。

事实上,IIRC,for循环被语言转换为each方法调用,这样:

for item in collection do
 # work with item
end

转变为

collection.each do |item|
 # work with item
end

因此,您的上一条错误消息是自each方法在Array上定义而不是在Fixnum

上定义的
  • 您的第一个示例使用for和until,它们是相同的(或相当的),这将会崩溃。

尝试使用puts进行实验,看看究竟发生了什么

def alq(l_answer)
  l = l_answer
  for i in l do
    puts "#{i} in for loop"
    until i = 0
      puts "#{i} in until loop"
      if i = 1 
        "R:________________________________________"
        i -=1
      else
        "__________________________________________"
        i -= 1
      end
    end
  end
end

可能有其他人,这似乎正常,因为我理解你是初学者,但我不是在这里指出错误

for循环在ruby中很少使用,有些循环方法使用更加惯用(又称红宝石方式)。 Integer#timesArray#each是其中两个。另请参阅Enumerable Module,其中介绍了循环收集和处理单个项目的其他几种方法。

根据我的理解,这就是你想要的

def alq(l_answer)
  response = []
  l_answer.times do |index|
      if index = 0
        response += "R:________________________________________"
      else
        response += "__________________________________________"
      end
    end
    response.join('\n')
  end
end

甚至更好(我认为):

def alq(l_answer)

  (0...l_answer).map do |index|
      (index == 0 ? "R:" : '__') + "______________________________________"
  end.join('\n')
end
  • (0...l_answer)是独家range,您可以将其视为[0,1,2,...,l_answer-1]
  • map是来自Enumerable module
  • 的方法