如何在从 ERB 动态创建的 html 中调用 image_tag 和 number_to_currency

How to call image_tag and number_to_currency in dynamcially created html from ERB

我正在尝试从 ERB 创建一个 html 文件,因为我想保存一份计算非常复杂的发票副本。我的 ERB 模板使用了许多不同的计算并大量使用 number_to_currencyimage_tag

以下是我的操作方法

def save_invoice
    erb_file = 'app/views/orders/invoice.html.erb'
    html_file = File.basename(erb_file, '.erb')
    erb_str = File.read(erb_file)
    renderer = ERB.new(erb_str)
    @order = Order.find(params[:id]).to_i
    result = renderer.result(binding)

      File.open(html_file, 'w') do |f|
        f.write(result)
      end
    end

我的invoice.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Invoice</title>
 </head>
<body>
<header>
    <%= image_tag 'logo_new.png', width: '110',height: '100' %>
</header>
<h1>Invoice # <%= @order.id %></h1>
<p>Client : <%= @order.user.first_name %>, <%= @order.user.last_name %></p>
<p>Amount : <%= number_to_currency(@order.totals) %></p>

它正在制作 html 文件,但如果我删除所有 image_tag(查看器助手)和 number_to_currency 函数。那么我如何在我的 ERB 中使用这些功能。我知道这是因为我正在创建 ERB 字符串我真的不了解这段代码,而不是当我删除所有这些功能时正在工作的参考。请建议我应该在方法中包含什么。我把代码放在这里很紧凑,实际上代码很多乱七八糟的,有几千行。

我刚刚意识到我已经使用了绑定,所以为什么不将视图助手作为对象调用并在我的视图中使用它的功能。这样它会自动将助手发送到 ERB 文件。我在 save_invoice 方法

中的 def save_invoice 之后在顶部添加了以下行
    @views_helper = ActionView::Base.new 

现在,在我的 erb 文件中,我已将 image_tag 替换为添加此对象,如下所示

<%= @views_helper.image_tag 'logo_new.png', width: '110',height: '100' %>

对于我的 number_to_currency 我做了同样的事情


<p>Amount : <%= @views_helper.number_to_currency(@order.totals) %></p>

它解决了我的问题,目前工作正常,我确定我正在制作完整的对象然后将其转发以查看可能会产生大量请求的后果,但这对我来说工作正常。

关于我创建对象和绑定的解释,将显示我的 ERB 文件中的所有局部变量,因此该对象也可以访问并完成工作。