我想通过ERB文件在Sinatra中显示这个循环我该怎么做。
(这是代码)
puts "Please enter any positive integar from 0"
n = gets.chomp.to_i
def ping_pong(n)
x = 0.upto(n) {|g|
if g % 3 == 0 && g % 5 == 0
print "ping-pong" + " "
elsif g % 3 == 0
print "ping" + " "
elsif g % 5 ==0
print"pong" + " "
else
print "#{g}" +" "
end
}
return x
end
ping_pong(n)
感谢
答案 0 :(得分:1)
此代码在erb文件中不起作用。
将您的功能代码放在< %%>内标签和要渲染的代码(也就是“print”中的行)<%=%>标签
答案 1 :(得分:1)
首先,您的代码无法正常工作,因为这一行:
n = gets.chomp.to_i
Kernel#gets(实际上调用$ stdin)将停止运行 sinatra 的ruby进程,并且需要控制台上的一些输入并阻止进程直到收到输入数据。如果ruby进程被守护进程,该行将引发错误。因此,您应该在其他地方获取n
变量。例如,通过从html表单发送此号码。
二。在循环内的方法ping_pong
中,调用print
方法,这些字符串(收到print
方法)将转到$ stdout。但是你需要ERB缓冲区,在其中发送这些数据以便在浏览器中显示它。
为了实现此目标,您可以重新实现方法以使用ruby块和yield
关键字:
def ping_pong(n)
x = 0.upto(n) do |g|
if g % 3 == 0 && g % 5 == 0
yield "ping-pong" + " "
elsif g % 3 == 0
yield "ping" + " "
elsif g % 5 ==0
yield "pong" + " "
else
yield "#{g}" +" "
end
}
return x
end
此方法应在sinatra helpers
块中定义,以便在ERB模板中可用。
然后在ERB模板中你应该写这样的东西
<% ping_pong(n) do |out| %>
<%= out %> <!-- Prints "pong" strings -->
<% end %>
<% %>
仅用于执行代码
<%= %>
用于执行代码并在渲染结果中显示它的返回值