如何将字符串插入erb文件以在rails 3.2中呈现?

时间:2013-08-07 23:47:04

标签: ruby-on-rails ruby ruby-on-rails-3 erb

我们要做的是在erb中存储一大块string代码,然后在erb中以run time呈现代码。

这是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 个答案:

答案 0 :(得分:3)

我想我得到了你的问题。 你可以在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使用渲染:内联。 rails guide

我已经检查了这件事。如有任何问题,请告诉我。

答案 1 :(得分:1)

看起来像是部分工作。

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

...

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

更新。

如果您需要在数据库中存储ERB模板并实时渲染它们,请查看render erb from database into view problem please help!

但是,我不知道这是否是您最好的选择,因为它可能导致安全问题和其他问题(即,如果您更改代码,存储在数据库中的模板可能会中断)。在大多数情况下,最好只为你需要做的事情制作一个新的模型,然后用Rails方式(有部分)来做。

答案 2 :(得分: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标记”:<%= "<%=" %><%= "%>" %>将成为<%=%>,其余的在第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

答案 3 :(得分: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>