Rails - 仅在显示特定页面时呈现部分

问题描述:

我有一个使用Ajax的应用程序,这有助于在用户每次单击链接时无需刷新整个页面。Rails - 仅在显示特定页面时呈现部分

在application.html.erb文件我有:

<body> 
    <%= render :partial => 'layouts/user_page_with_map' if @show_map %> 

    <div class ='page-content'>  
    <%= content_for?(:body) ? yield(:body) : yield %> 
    </div> 

</body> 

在我的控制器的显示方法是:

def show 
    @show_map = true 
    @review = Review.new 
    @reviews = @user.reviews 
    end 

的问题是,我的网页上停留部分所有的时间 - 收益的东西出现在它下面。因此,如果某人点击了“联系我们”或“关于我们”或其他任何内容,即使它与“联系我们”或“关于我们”无关,它也会出现在地图下方。

我远离Ajax的专家 - 获得了很多帮助,但它非常有用,可以很好地消除这种需求! - 用于所有这些页面重新加载。 有没有一种方法来编码它,以便只有当被点击的链接激活'显示'页面时,部分才会显示?任何其他相关的意见,将不胜感激,谢谢。

Chris。

+0

这是因为你的@show_map是真的,并且该值将始终为真? – Nich 2013-04-21 01:12:29

+0

是的,每次Ajax调用/点击我的链接,它似乎都会绕过application.html.erb,其中show_map已设置。你知道是否有任何方法可以每次检查该页面吗?我可以在其他控制器中将show_map设置为false,但没有太多点被绕过。谢谢。 – CHarris 2013-04-21 08:13:40

在ajax方法中,您可以在接收到页面内容之后再浏览页面内容。我会假设你正在使用jQuery:

$.ajax({ 
    type: "GET", 
    #... 
    success: function(data) { 
    $(".page-content").replaceWith($(data).find(".page-content")); 
    } 
}); 

我的意见,它是你的最佳方式。在这种情况下,您的后端不关心“您是否使用布局进行渲染”。

+0

谢谢,我稍后会详细讨论这个问题。原因是我必须首先做这个部分的事情,因为我的谷歌地图没有显示在我的div中,当从Ajax调用时,其他所有内容都显示,但是地图是一个很大的白色盒子。任何想法为什么这可能是? – CHarris 2013-04-21 08:16:58

+0

这种情况,因为谷歌地图无法正确初始化。在显示popup div后,你应该触发调整事件'google.maps.event.trigger(map,'resize')'。 – ole 2013-04-21 10:55:15

+0

嗨,这不是一个弹出窗口 - 我假定你正在谈论一个弹出窗口?,但是你可能会让我走上正确的轨道,我正在研究它。谢谢 – CHarris 2013-04-21 23:15:53

假设您的控制器名为FooController,并且您通过Ajax调用的操作是bar。以下是一个合适的解决方案。

配置/ routes.rb中:

get 'bar', to: 'foos#bar' 

应用程序/控制器/ foos_controller.rb:

class FoosController < ApplicationController 
    layout false, only: [:bar]     # <-- layout false is key 

    def bar 
     @results = Foo.get_results(bar_params) 
    end 

private 

     def bar_params 
      params.permit(:utf8, :query, :attribute1, :attribute2) 
     end 
end 

应用/视图/ FOOS/bar.html.erb:

<% @results.each do |result| %> 
    <p><%= result.inspect %></p> 
<% end %>