我正在尝试从控制器内的ERB对象呈现HTML(ERB对象存储在数据库中),但没有成功。
我想做这样的事情:
首先,我创建了一个Func
实例:
Func.Create(text: "<% @users.each do |user| %>
<td><%= user.id %></td>
<td><%= link_to user.username, user_path(user) %></td>")
然后,在控制器中:
class MainController < ApplicationController
def foo
@users = User.all
render :html => bar(binding)
end
def bar(controller_binding)
html = Func.find(1)
template = ERB.new(html.text)
template.result(controller_binding)
end
end
但我得到的只是错误,如下:
"Missing template main/resource_name, application/resource_name with
{:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby,
:jbuilder, :coffee]}. Searched in: * "c:/Users/david/sample/app/views""
和
"(erb):3: syntax error, unexpected $end, expecting keyword_end ...
ut.force_encoding(__ENCODING__) ... ^"
答案 0 :(得分:1)
替换
Func.Create(text: "<% @users.each do |user| %>
<td><%= user.id %></td>
<td><%= link_to user.username, user_path(user) %></td>")
与
Func.Create(text: "<% if @users.nil? %>
<p> There are no users in database </p>
<% else %>
<% @users.each do |user| %>
<td><%= user.id %></td>
<td><%= link_to user.username, user_path(user) %></td><% end %> <% end %>")
阻止 <% end %>
块结束。
另外,将render :html => bar(binding)
替换为render :inline => bar(binding)
您还可以缩短代码,如下所示
def foo
@users = User.all
html = Func.find(1)
render :inline => html.text
end
答案 1 :(得分:0)
你不应该在控制器中这样做。不确定你想要完成什么,但看起来帮助者可能更合适。