【发布时间】:2013-04-26 01:26:55
【问题描述】:
我有一个控制器可以同时响应html 和js。 html 视图呈现整个页面(包括页眉和页脚),而 js 仅替换 #main。除了页眉和页脚之外,两种格式都呈现相同的内容。我可以用三个文件来实现这个效果:
_show.html.erb
<div>Content!</div>
show.html.erb
<%= render "show" %>
show.js.erb
$("#main").fadeIn("<%= escape_javascript(render 'show') %>");
这可行,但如果我不需要单独的 _show 部分,我会更喜欢。不幸的是,这不起作用:
show.html.erb
<div>Content!</div>
show.js.erb
$("#main").fadeIn("<%= escape_javascript(render 'show') %>");
因为 Rails 将寻找 show 部分,而不是实际视图。
有没有办法让 Rails 查找视图文件,而不是部分文件?
【问题讨论】:
-
您可以使用
:file选项,例如:file => 'show'。渲染助手会将render 'yourview'的字符串参数隐式转换为render :partial => 'yourview'。但是,您将遇到的问题是 js 操作中的查找上下文将“显示”解析为 js 版本,可能会导致无限循环或类似情况。 -
谢天谢地,它不会循环播放。至少,现在还没有。现在我收到
missing template错误。看起来它甚至找不到自己。 -
在另一个视图中渲染一个非局部视图并不完全是 Rails Way™。您当前的解决方案可能更好。如果您对命名感到奇怪,请将其重命名为
_body。在这种情况下,您将看到的常见内容是render(@resource),它变成了部分路径,例如resources/_resource. -
感谢您的意见。我觉得这可能是最好的方法,但我想先征求其他开发人员的意见。从长远来看,这种方法可能存在一些维护问题,尤其是当我使用此功能编写更多操作时。不过,至少在短期内,我可以设置一台发电机来完成这项工作。
-
曾几何时,您可以在控制器中执行类似的操作,以便在 javascript 操作中获取 HTML 视图渲染的内容:
lookup_context.update_details(:formats => [:html]) { @content = render_to_string }。然后在 js 视图中你可以render(@content)。然而那是 Rails 3.0.x,即使在那时也可能不是一个干净的解决方案。
标签: ruby-on-rails view render