我正在尝试在<%= render 'layouts/header' %>
中进行“主页”链接执行ajax / jquery调用以更改内容div中部分内容中的<%= yield %>
。我得到的只是视图中的空白.. <%= yield %>
在没有ajax的情况下放入部分时效果很好,但是在使用ajax时它没有显示任何内容... can yield
不能以这种方式使用?
所有我真正想要的是能够点击我的网站导航链接而无需重新加载整个页面......
我的application.html.erb文件如下所示:
<head>
$(function() {
$("#home").live("click", function() {
$.get(this.href, null, null, "script");
return false; }); });
</head>
<body>
<div id="container">
<%= render 'layouts/header' %>
<div id="content">
<%= render 'layouts/content' %>
</div>
<%= render 'layouts/footer' %>
</div>
</body>
我的<%= render 'layouts/header' %>
包含:
<%= link_to "Home", root_path, :id => "home" %>
我的<%= render 'layouts/content' %>
仅包含:
<%= yield %>
home.js.erb
$("#content").html("<%= escape_javascript(render("layouts/content")) %>");
答案 0 :(得分:2)
您的用例正由rails-ajax gem解决。
您只需将div#content
作为其主要默认容器进行配置,您的网站将自动使用此容器进行调整。无需更改应用程序的代码。
它为您处理了很多麻烦:书签,历史记录,脚本执行,重定向,表单,JS禁用浏览器的后备......
您还可以指定在某些特定控制器的操作上刷新其他部分。
答案 1 :(得分:1)
在home.js.erb
中,您正在渲染一个空的布局文件。尝试渲染一些视图。
您可以将<%= yield %>
视为布局文件中呈现的视图内容的占位符。如果你只渲染布局,就没有什么可以放在那里。
http://guides.rubyonrails.org/layouts_and_rendering.html#understanding-yield
替代解决方案
将其添加到控制器顶部以禁用ajax请求的布局:
layout Proc.new { |controller| controller.request.xhr? ? false : 'application' }
这会使#header
内的所有链接都加载ajax,并将结果放到#content
div:
$(function() {
$('#header a').live('click', function() {
$('#content').load(this.href);
return false;
});
});
从控制器操作中删除js格式,因为不再需要它了。