gpt4 book ai didi

ruby-on-rails - 如何在 Rails 3.2 erb 中使用 eval 在运行时执行存储在字符串中的 View 代码?

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:15 25 4
gpt4 key购买 nike

我们正在尝试做的是存储一大块 erb string 中的代码然后在运行时执行代码。这是我们所做的测试:

  1. 从工作 erb 文件中取出一大块代码,
  2. 用 eval 重写 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文件如下:

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

</table>

在重写之前,代码块在 <table> 之间。 .现在变量 code返回 string代码块和eval执行代码块。但这是错误:

(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:

上面的代码有什么问题?

最佳答案

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 解决你的问题

关于ruby-on-rails - 如何在 Rails 3.2 erb 中使用 eval 在运行时执行存储在字符串中的 View 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18114185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com