在Rails 3 div中排除应用程序布局

时间:2011-10-08 14:05:10

标签: ruby-on-rails-3

我正在使用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>&nbsp;</span><% end %></li>
  </ul>
  <div>
  </div>
</div>

然而,这会在<ul id="infoContainer">

中加载部分内容

2 个答案:

答案 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响应正常运行则不应该这样做。