如何在Erb文件中显示Ruby函数

时间:2015-01-10 03:50:02

标签: ruby-on-rails ruby sinatra erb

我想通过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)

我希望Erb文件显示结果。

感谢

2 个答案:

答案 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 %>

<% %>仅用于执行代码

<%= %>用于执行代码并在渲染结果中显示它的返回值