NoMethodError undefined 方法 'alq' for 1:Fixnum



我在rails上是新的,这是我的第一个个人应用程序。我使用虾轨来生成PDF。

现在,我正在尝试根据l_answer定义的行数添加行

我收到此错误:考试中的NoMethodError#show - 1:Fixnum的未定义方法"alq">

我的虾码:

@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是类问题的论点。

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

所以

这个问题将有 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

而虾的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 并不是方法的好名称。你不是通过使用更少的符号来拯救树木,你是在使阅读;)变得更加困难——哈哈哈哈这就是菜鸟对:)的意义。感谢您的输入

你在这里有几个问题。

  • 为。。。in 仅适用于集合,而l_answer则不适用于。

事实上,IIRC,for 循环由语言转换为each方法调用,方式如下:

for item in collection do
 # work with item
end

被转化为

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

因此,自each方法在数组而不是 Fixnum 上定义以来,您的最后一条错误消息

  • 你的第一个示例使用 for 和直到,这是相同(或相当(的东西,这将崩溃。
尝试

尝试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

可能还有其他人,这似乎很正常,因为我知道您是初学者,但我不是在这里指出错误

对于 ruby 中很少使用循环,有一些循环方法的使用更惯用(又名 ruby 方式(。整数#次,数组#每个是其中的两个。另请查看可枚举模块,该模块定义了几种其他方法来循环访问集合并处理单个项目。

据我了解,这就是你想要的

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是来自枚举模块的方法

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

作为旁注,alql_answer并不是方法的好名称。您不是通过使用更少的符号来保存树木,而是使阅读;)

最新更新