0

我们正在尝试做的是在 a 中存储一段erb代码string,然后run time在 erb 中渲染代码。

这是存储为字符串的 erb 代码块:

<tr>
      <th>#</th>
      <th><%= t('Date') %></th>
      <th><%= t('Project Name') %></th>
      <th><%= t('Task Name') %></th>
      <th><%= t('Log') %></th>
      <th><%= t('Entered By') %></th>

    </tr>

    <% @logs.each do |r| %>
        <tr>
          <td><%= r.id %></td>
          <td><%= (r.created_at + 8.hours).strftime("%Y/%m/%d")%></td>
          <td><%= prt(r, 'task.project.name') %></td>
          <td><%= prt(r, 'task.task_template.task_definition.name') %></td>
          <td><%= prt(r, :log) %></td>
          <td><%= prt(r, 'last_updated_by.name') %></td>

        </tr>
    <% end %>

t() 是国际化的翻译方法。

我们如何将上面存储在字符串中的 erb 代码插入到下面的 erb 文件中以进行渲染(在伪代码中)?

  <table class="table table-striped">
    <% erb_code = retrieve(chunk_of_erb_code)%>
    <% erb_code here for rendering %>

  </table>

有解决问题的方法吗?感谢帮助。

更新:

工作代码render inline(通过kamesh):

<% erb_code = find_config_const('task_log_view', 'projectx')%>
<%= render inline: ERB.new(erb_code).result(binding) %>

作为一种好的做法,可以将变量 erb_code 移到控制器中。

4

4 回答 4

3

我想我明白了你的问题。您可以使用 in view 在 erb 中附加任何 html 字符串:

<%= render inline:"<p>new Field</p>"%>

或者

<%= render inline: "<% products.each do |p| %><p><%= p.name %></p><% end %>" %>

或在控制器中:

render inline: "<% products.each do |p| %><p><%= p.name %></p><% end %>"

将它写在任何 _xyz.html.erb 或 xyz.html.erb 中,也可以从控制器中使用。更多检查以下链接。在子主题中 - 2.2.6 将渲染与 :inline 一起使用。 导轨

我已经检查了这个工作。如果有任何问题,请告诉我。

于 2013-08-08T07:57:24.987 回答
1

似乎是部分工作。

# app/views/some_folder/_my_erb_partial 
<%= t(whatever) %>

...

<table class="table table-striped">
  <%= render 'some_folder/my_erb_partial' %>
</table>

更新。

如果您需要将 ERB 模板存储在数据库中并实时渲染它们,请查看将 erb 从数据库渲染到视图问题,请帮助!

但是,我不知道这是否一定是您的最佳选择,因为它可能导致安全问题和其他问题(即,如果您更改代码,存储在数据库中的模板可能会损坏)。在大多数情况下,最好为您需要做的任何事情创建一个新模型,并以 Rails 方式(使用部分)进行。

于 2013-08-08T00:18:20.200 回答
1

你肯定想用部分或助手来做,因为你要求的解决方案是复杂而令人困惑的。

但是如果你真的需要实现这个解决方案,你就必须创建一个 .html.erb.erb 文件,它会被 erb 解释两次。

鉴于以下助手

def print_one
  "1"
end

def print_a_method
  "<%= print_one %>"
end

通过 1,RoR 解释 html.erb.erb 文件,该文件最初如下所示:

<%= "<%=" %> print_one.to_i + print_one.to_i <%= "%>" %>

<%= print_a_method %>

<%= 5 + 3 %>

第一行的技巧是“为第二遍生成 erb 标签”:这将变成<%= "<%=" %>and ,第一行的其余部分在第 1 遍中不被解释。<%= "%>" %><%=%>

另一方面,第二行将在此遍中被完全解释,并且 的输出print_a_method将被放置在文件中,以便在第二遍期间对其进行解释。

第三行也被解释并输出其结果。

第 2 次,RoR 采用第一次的结果,现在是一个 .html.erb 文件。在内部它看起来像这样

# As you can seem the erb tags was generated, and now the erb code is ready for pass 2
<%= print_one.to_i + print_one.to_i %>

# The second line was interpreted and its result is erb code that will be interpreted during pass 2
<%= print_one %>

# the third line was interpreted and give the following output
8

最终渲染将是 .html 文件,其中解释了第 2 步中的文件,看起来像这样

2

1

8
于 2013-08-08T00:25:21.813 回答
1

(我能够相当简化我原来的答案。)

您可以像这样创建应用程序助手:

助手/application_helper.rb:

module ApplicationHelper

  def my_erb_converter(template)
    erb = ERB.new(template)
    erb.result
  end

  def t(str)
    "***#{str}***"
  end

end

然后在一个动作中做:

include ApplicationHelper

class SomeController < ApplicationController
  ...
  ...
  def some_action
    @html = my_erb_converter("<div><%= t('hello') %></div>")
    ...
  end

那么在你看来:

<table class="table table-striped">
    <%= raw @html %>
</table>

这也适用于我:

module ApplicationHelper

  def convert_erb(template)
    erb = ERB.new(template)
    erb.result
  end

  def t(str)
    "***#{str}***"
  end

  def get_erb
    "<div><%= t('hello') %></div>"
  end
end

看法:

<table class="table table-striped">
    <%= raw convert_erb(get_erb) %>
</table>
于 2013-08-08T00:57:55.937 回答