如何使用rails 3.2 erb中的eval在运行时执行存储在字符串中的视图代码?

时间:2013-08-07 21:30:57

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

我们要做的是在erb中存储一大块string代码,然后在run time中执行代码。这是我们做的测试:

1. take out a chunk of the code from a working erb file and, 
2. rewrite the erb file with eval. 

以下是取出的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文件:

  <table class="table table-striped">
    <% code = find_config_const('task_log_view', 'projectx')%>
    <%= eval(code)%>

  </table>

在重写之前,chunk of code介于<table>之间。现在,变量code返回代码块的stringeval执行代码块。但这是错误:

(eval):1: syntax error, unexpected '<'
(eval):4: syntax error, unexpected tIDENTIFIER, expecting $end
      <th><%= t('Project Name') %></th>
               ^

Extracted source (around line #6):

4:   <table class="table table-striped">
5:      <% code = find_config_const('task_log_view', 'projectx')%>
6:     <%= eval(code)%>
7: 
8:   </table>
9: 

上面的代码出了什么问题?谢谢你的帮助。

1 个答案:

答案 0 :(得分:9)

eval通过评估ruby代码来工作。

irb(main):001:0> eval('puts "Hello World"')
Hello World
=> nil

虽然转换erb模板应该使用ERB

完成
irb(main):002:0> require 'erb'
irb(main):003:0> ERB.new('<%= "Hello World" %>').result
=> "Hello World"

我的猜测是code实际上是一个包含ERB模板而不是ruby代码的字符串。

尽管如此,我认为这不是一个好方法。 task.project.name可能来自可能来自用户输入的数据库。对此进行评估似乎不是一个好主意。

您可以使用正常partials

来解决问题