我在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
方法。
作为旁注,alq
和l_answer
并不是方法的好名称。您不是通过使用更少的符号来保存树木,而是使阅读;)