如何在Rails3.2erb中执行在运行时以字符串形式存储的视图代码?

hmtdttj4  于 2022-10-15  发布在  Ruby
关注(0)|答案(1)|浏览(142)

我们尝试做的是将erb代码块存储在string中,然后在运行时执行代码。这是我们做的一个测试:
1.从工作的erb文件中取出代码块,
1.用val重写erb文件。
以下是取出的ERB代码块:

  1. <tr>
  2. <th>#</th>
  3. <th><%= t('Date') %></th>
  4. <th><%= t('Project Name') %></th>
  5. <th><%= t('Task Name') %></th>
  6. <th><%= t('Log') %></th>
  7. <th><%= t('Entered By') %></th>
  8. </tr>
  9. <% @logs.each do |r| %>
  10. <tr>
  11. <td><%= r.id %></td>
  12. <td><%= (r.created_at + 8.hours).strftime("%Y/%m/%d")%></td>
  13. <td><%= prt(r, 'task.project.name') %></td>
  14. <td><%= prt(r, 'task.task_template.task_definition.name') %></td>
  15. <td><%= prt(r, :log) %></td>
  16. <td><%= prt(r, 'last_updated_by.name') %></td>
  17. </tr>
  18. <% end %>

t()是国际化的翻译方法。
以下是重写后的erb文件:

  1. <table class="table table-striped">
  2. <% code = find_config_const('task_log_view', 'projectx')%>
  3. <%= eval(code)%>
  4. </table>

在重写之前,代码块位于<table>之间。现在,变量code返回代码块的stringeval执行代码块。但这里有一个错误:

  1. (eval):1: syntax error, unexpected '<'
  2. (eval):4: syntax error, unexpected tIDENTIFIER, expecting $end
  3. <th><%= t('Project Name') %></th>
  4. ^
  5. Extracted source (around line #6):
  6. 4: <table class="table table-striped">
  7. 5: <% code = find_config_const('task_log_view', 'projectx')%>
  8. 6: <%= eval(code)%>
  9. 7:
  10. 8: </table>
  11. 9:

上面的代码有什么问题?

ljo96ir5

ljo96ir51#

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

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

转换ERB模板时应使用ERB类完成

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

我猜测code实际上是一个包含ERB模板而不是Ruby代码的字符串。
尽管如此,我不认为这是一个好方法。task.project.name可能来自数据库,可能来自用户输入。在这上面做评估似乎不是一个好主意。
也许你可以用普通的partials解决你的问题。

相关问题