2011-07-24 48 views
0

我想使用jQuery刷新頁面上的部分內容,但是我無法獲得部分內容,因爲它需要的集合在jQuery代碼執行後不可用。當使用Jquery遠程刷新頁面元素時,如何讓集合/變量持久?

我在用戶控制器表演動作:

def show 
     @user = User.find(params[:id]) 
     @title = "#{@user.first_name} #{@user.last_name}" 
     @posts = @user.posts.paginate(:page => params[:page], :per_page => 20) 
     @discussions = @user.discussions.paginate(:page => params[:page], :per_page => 2) 
    end 

這使得集合@posts和@discussions可用的用戶展示頁面上傳遞給泛音如下,在show.html.erb:

<div id="synopsis"> 
    <%= render :partial => 'users/post', :collection => @posts %> 
</div> 
<div class="pagination_links"> 
    <%= will_paginate(@posts) %> 
</div> 

然而,讓我們說,我想更換顯示用戶展示頁面上給用戶的討論,即使用在表演動作可用@discussions的職位。爲此,我在用戶控制器中設置了一個名爲show_discussions的自定義操作,並使其路由起作用。這是行動:

def show_discussions 
    respond_to do |format| 
    format.js 
    end 
end 

此引用show_discussion.js.erb

$("#synopsis").html("<%= (escape_javascript("#{render(:partial => 'discussion_activity', :collection => @discussions)}")).html_safe %>"); 

此文件成功取代#synopsis,但沒有填充它 - 作爲集合@discussions通過不持續遠程調用此操作。我該如何解決這個問題,以便在遠程調用之後用戶討論可用?

更新:我使用js文件進行ajax請求。我指定獲取用戶行爲show_discussions一個按鈕被點擊時:

$(function() { 
$('#show_discussions').live("click", function() { 
    $.get('/users/show_discussions'); 
}); 
    $('#show_posts').live("click", function() { 
    $.get('/users/show_posts'); 
}); 
}); 

回答

0

記住你的應用程序有沒有從一個請求到下一個上下文(嗯,除了什麼在你的會話,你的帖子變量)。無論您需要渲染視圖,您都必須在控制器操作中提供。

您可以將任何所需的上下文(例如用戶標識)作爲ajax請求的參數傳遞。

舉一個例子,看到first answer to this question

由於您使用GET而不是POST,你可以寫,當它到視圖只是釘的用戶ID到URL。您的腳本應該看起來像這樣:

$.get('/users/show_discussions/123); 

其中123是用戶的ID。

要輸入用戶ID到視圖作爲一個javascript變量,你可以這樣做:如果你在頁面上只有一個用戶ID

<script> 
    var jsUserID = <%= @user.id %> ; 
</script> 

。您的鏈接代碼變爲:

$.get('/users/show_discussions/' + jsUserID); 

TL; DR:你需要show_discussions

+0

確定以加載@discussions,所以我想我可以保存用戶的ID在我的會議,然後後將其刪除。但是,還有其他更好的方法嗎?例如,當「show」被調用時,你可以從params [:id]中找到一個用戶。也許(如果我學會了如何,當然),我可以用這種方式?感謝您的幫助Jeff – jay

+0

看我的(相當短)編輯。你能發佈執行ajax請求的代碼嗎? –

+0

我當前使用js文件在單擊div #show_discussions時發出請求。 – jay

相關問題