代码之家  ›  专栏  ›  技术社区  ›  numbers1311407

Rails:如何使用JS模板中的布局进行渲染?

  •  2
  • numbers1311407  · 技术社区  · 16 年前

    我很熟悉使用Ajax模板来更新页面的特定部分,但是如何呈现 什么时候布置?例如,给定布局:

    #foo
      = yield :foo
    

    一个简单的视图“show.html.haml”:

    = render @bar
    

    还有一部分:

    - content_for :foo
      = bar.to_html
    

    ... HTML结果将在布局中呈现,我将看到我的栏内容,但是我想使用Ajax来更新 只有 foo div.I创建“show.js.erb”:

    $("#foo").html("<% escape_javascript(render(@bar)) %>");
    

    但是结果什么也不是,因为我的工具栏部分被呈现在布局之外,因此我的:foo内容永远不会屈服于。如何让JS模板在该布局中呈现?

    1 回复  |  直到 16 年前
        1
  •  3
  •   numbers1311407    16 年前

    我找到了两个答案,但我不知道是否还有更好的办法。 .


    这可能是“更正确”的方法,但不幸的是,我很快就会解释,这不适合我的情况。

    我没有完全意识到的是,在JS请求中,查找格式设置为JS 和

    但不会的 以相同的方式查看HTML布局,这意味着HTML模板将被呈现,但content_for块永远不会被屈服,从而导致空响应。

    $("#foo").html("<% escape_javascript(yield(:foo)) %>");
    

    这样,HTML模板被呈现,但是在JS布局中,#foo的HTML被替换为响应的新内容。


    2。在JS响应块中呈现HTML内容。

    感觉不太理想,请告诉我是否有更合适的方法。但这就是我想到的:

    # in bars_controller.rb
    def show
      # ...
      respond_to do |format|
        format.js do
          lookup_context.update_details(:formats => [:html]) do
            @content = render_to_string
          end
    
          render
        end
      end
    end
    

    这样,我临时将模板查找的mimetype设置为HTML,将内容呈现为变量,然后呈现JS模板:

    // show.js.erb
    $("#foo").html("<%= escape_javascript(@content) %>");
    

    这还有一个更复杂的问题。在我的嵌套布局设置中,在HTML响应中,布局调用其父级的呈现来继续构建主体,从而生成完整的页面。在我的例子中,我希望它只是返回正文内容。因此,虽然我不需要JS布局来实现这个解决方案,但我确实需要稍微更改布局,如下所示:

    -# my_layout.html.haml
    
    -# (given a parent layout that yields to :body)
    - content_for :body do
      = yield(:foo)
    
    - if request.xhr?
      = yield(:body)
    - else
      = render :file => "layouts/my_parent_layout"
    

    这样,就不会对JS请求调用父级,只会生成主体(直到嵌套布局堆栈中的这一点)。

    推荐文章