在Rails 5中将部分渲染为字符串

时间:2019-05-08 01:06:13

标签: ruby-on-rails ruby-on-rails-5

我的偏见如下:

# common/_widget.html.erb
<div class="widget">
  <%= process_content_tags(variable_with_html) %>
</div>

在variable_with_html内部(内容来自数据库),我可能会有:

<h1>Hello, [first_name] !</h1>
<strong>Welcome to our website!</strong>
<p>Here are some options to get you started:</p>
[menu]
Thank you for using our services!<br />

我有很多标记,例如[first_name],可用于向HTML添加数据,process_content_tags函数通过查找和替换来实现,但是我无法呈现部分标记,例如:

content.gsub("[menu]", render(:partial => "common/navbars/menu") )

“ _ menu.html.erb”部分可以具有基于会话,请求和其他变量从数据库生成的一堆链接,不能仅仅将@user和session作为本地变量传递给它并使用一个ApplicationController.render(...,我已经尝试过并很快放弃了。

.render_to_string方法也不起作用。

当然,我无法评估该变量中的内容。

我已经检查了其他答案,看来它们只使用1-2个var或根本不使用,因此render_to_string对他们来说是种工作。

我已经考虑过使用Liquid和其他几种模板语言,无法真正弄清楚如何以自己想要的方式拥有一些动态内容。同样,当人们想要通过拖放操作将用户菜单添加到小部件中时,也不想让人们使用某种随机模板语言来编写菜单。

现在,我正在做这个让人讨厌的把戏(不能称其为hack):

在助手中...

@required_menus = []
["account", "affiliates", "agents", "bottom", "footer", "header", "navbar", "secondary", "top", "users"].each do |menu|
    doc_content.scan(/\[menu\[([^\]]*)\]\]/).flatten.each do |str|
        @required_menus << str
        doc_content = doc_content.gsub("[menu["+str+"]]", "")
    end
end

在小部件中:

<%= process_content_tags(widget.content).html_safe %>
<% @required_menus.uniq.each do |menu| %>
    <%= render :partial => "common/navbars/navbar", :locals => { :area => menu } %>
<% end %>

我该如何以值得本千年的文明方式完成这项工作?

0 个答案:

没有答案