我在轨道上做了新的,这是我的第一个个人应用程序。我使用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意味着什么:)。感谢您的输入
答案 0 :(得分:0)
好吧,似乎q.question.l_answer
是一个整数,而不是Question
,当然它没有定义alq
方法。
作为旁注,alq
和l_answer
不是方法的好名字。你不是通过使用较少的符号来保存树,而是使你更难阅读;)
答案 1 :(得分:0)
这里有几个问题。
事实上,IIRC,for循环被语言转换为each
方法调用,这样:
for item in collection do
# work with item
end
转变为
collection.each do |item|
# work with item
end
因此,您的上一条错误消息是自each
方法在Array上定义而不是在Fixnum
尝试使用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#times,Array#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