Rails:从视图中渲染视图(不是部分视图)

时间:2013-05-02 00:18:00

标签: ruby-on-rails view render

我有一个响应htmljs的控制器。 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查找视图文件,而不是部分?

4 个答案:

答案 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具有视图部分布局的概念。也就是说,视图是你应该只使用一次的视图。所以我的建议是:

  1. 如果您觉得可以在当前视图中呈现多个额外视图,那么您很可能正在寻找布局
  2. 如果您觉得您的某个观点应该在多个页面中呈现,那么您正在寻找部分
  3. 如果此视图仅在其中呈现一个额外视图,并且该视图应仅在当前视图中呈现,则您可以选择以上中的任何一个 strong> - 就是这样,使用单个文件

答案 3 :(得分:3)

您只需将上下文传递给render方法:

<%= render :template => "show" -%>