2013-04-21 165 views
0

我有一個使用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

回答

3

在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

0

假設您的控制器名爲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 %>