【问题标题】:NoMethodError undefined method `alq' for 1:FixnumNoMethodError 未定义方法 'alq' 为 1:Fixnum
【发布时间】:2014-12-04 16:15:46
【问题描述】:

我对 Rails 很陌生,这是我的第一个单独的应用程序。我使用 Prawn-rails 生成 PDF。

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

我收到此错误:Exams#show 中的 NoMethodError - 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 是 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 并不是方法的好名称。您并没有通过使用更少的符号来拯救树木,而是让阅读变得更加困难;)-哈哈哈哈这就是菜鸟的意思:)。感谢您的输入

【问题讨论】:

  • 我认为应该是pdf.text "#{q.question.alq}" 而不是pdf.text "#{q.question.l_answer.alq}"
  • 感谢@UriAgassi 的回答!我试过了,现在我得到了这个错误:undefined method 'l_answer' for nil:NilClass ...

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


【解决方案1】:

这里有几个问题。

  • for...in 仅适用于集合,而 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​​ 中很少使用,有一些循环方法使用得更惯用(又名 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 的方法

【讨论】:

    【解决方案2】:

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

    作为旁注,alql_answer 并不是方法的好名称。你不是通过使用更少的符号来拯救树木,而是让它更难阅读;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2013-04-24
      相关资源
      最近更新 更多