我正在使用Ajax加载模板profile_messages
作为jQuery UI选项卡的一部分。但是当它加载时,profile_messages
继承了我网站的应用程序布局(页眉,页脚,所有内容)。我尝试将其作为一个部分,但事情并没有奏效。所以我想知道是否有办法做到这一点。
我的application.js
中的jQuery:
$(function() {
$( "#tabs" ).tabs({
ajaxOptions: {
error: function( xhr, status, index, anchor ) {
$( anchor.hash ).html(
"There was an error loading this tab. Please try again." );
}
}
});
});
Routes.rb
:
resources :profiles do
get :profile_messages, :on => :collection
end
match "/profiles/profile_messages" => "profiles#profile_messages"
我的profiles#show.html.erb
:
<div id="tabs">
<ul id="infoContainer">
<li><a href="#tabs-1">About</a></li>
<li><%= link_to "Messages", '/profiles/profile_messages/', :id => 'qs', :remote => true %></li>
</ul>
<div id="tabs-1">
</div>
</div>
我的profile_messages
模板:
<div id="tabs-2">
<% for message in @user.messages %>
<% end %>
</div>
我的profile_messages.js.erb
:
$( "#tabs" ).html( "<%= escape_javascript( render(@profile.messages) ) %>" );
profile_messages
中的profiles_controller.rb
方法:
def profile_messages
@profile = User.find(user.id).profile #need to fix so @profile is defined for each profile, not just the current_user profile
@messages = User.find(@profile.user_id).messages
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @messages }
end
end
那么有什么方法可以解决应用程序布局问题吗?
更新:我通过在profile_messages
def profile_messages
@profile = User.find(user.id).profile
@messages = User.find(@profile.user_id).messages
respond_to do |format|
format.html { render :layout => nil }
format.xml { render :xml => @messages }
end
end
更新2:我尝试渲染部分但不起作用。这是我在profiles#show.html.erb
中更改的内容:
<div id="tabs">
<ul id="infoContainer">
<li><a href="#tabs-1">About</a></li>
<li><%= link_to render(:partial => 'profiles/profile_messages'), :id => 'qs', :remote => true do %>Messages<span> </span><% end %></li>
</ul>
<div>
</div>
</div>
然而,这会在<ul id="infoContainer">
答案 0 :(得分:4)
在控制器中,在“show”操作结束时添加:
render :layout => nil
或者,如果您从其他地方渲染,只需添加:layout =&gt; nil选项来渲染。
更好的解决方案是使其成为局部并调用渲染:partial =&gt; “profile_messages / profile_message”(如果您在app / views / profile_messages / _profile_message.html.erb中有模板 - 请注意文件名中的_!)
而不是使用escape_javascript,它实际上更容易抛弃“引号并使用(渲染...)。to_json。
答案 1 :(得分:0)
您的控制器中是否定义了JS的响应格式?如果它正确呈现JS响应,它不应该呈现布局。您的日志是否显示&#34;以JS格式回复&#34;?
respond_to do |format|
format.js
end
正如mrbrdo所提到的,您也可以执行render :layout => false
但如果JS
响应正常运行则不应该这样做。