【问题标题】:How to display Ruby Functions in Erb file如何在 Erb 文件中显示 Ruby 函数
【发布时间】:2015-01-10 03:50:02
【问题描述】:

我想通过 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 文件显示结果。

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby sinatra erb


    【解决方案1】:

    此代码原样在 erb 文件中不起作用。

    将您的功能代码放在 标记内,将要呈现的代码(也就是带有“打印”的行)放在 标记内。

    【讨论】:

    • 我得到了将代码放在 标记中的概念,但是如果我只是将整个函数放在标记中,它仍然不会呈现。你会如何重新编码来渲染?谢谢..
    • 尝试将此方法放在帮助程序中,然后在视图中调用 。您不应该在视图中编写方法。
    【解决方案2】:

    首先,由于这一行,您的代码将无法正常工作:

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

    &lt;% %&gt; 仅用于执行代码

    &lt;%= %&gt; 用于执行代码并在渲染结果中显示它的返回值

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多