我有一个响应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查找视图文件,而不是部分?
答案 0 :(得分:26)
在另一个视图中渲染非局部视图并不完全是Rails Way™。您当前的解决方案可能更好,而不是一种不常见的方法。如果您对部分名称与操作相同感到奇怪,请将其重命名为_body或其他适当的内容。
但是,如果您的视图可以共享,在这种情况下似乎可以,您可以将其设置为布局。
事实证明,如果不存在html
模板,Rails会为js
操作呈现js
模板。这意味着您可以删除js模板和部分模板,只需创建一个名为fadein.js.erb
的布局:
# yourviews/show.html.erb
<div>Content!</div>
# layouts/fadein.js.erb
$("#main").fadeIn("<%= escape_javascript(yield) %>");
# YourController.rb
def show
# ...
respond_to do |wants|
wants.html
wants.js { render :layout => "fadein" }
end
end
答案 1 :(得分:22)
与其他人提到的一样,在另一个视图中呈现另一个非局部视图是“不是轨道方式”,如果你仍然坚持这样做,一种方法是:
<%= render :file => '<replace with relative/absolute path>' %>
答案 2 :(得分:10)
这不是一个很好的做法,你可以通过评论看到。 Rails具有视图,部分和布局的概念。也就是说,视图是你应该只使用一次的视图。所以我的建议是:
答案 3 :(得分:3)
您只需将上下文传递给render
方法:
<%= render :template => "show" -%>