我们要做的是在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移动到控制器中。
答案 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>