2012-12-19 41 views
12

Rails應用程序(3.2.8)和turbolinks(不確定是否相關)啓用。Rails技術在重定向後執行javascript

  1. 我在用戶顯示頁面上有一些信息,link。 (例如,事情有了變化的通知。)
  2. 當鏈接用戶點擊我要他直接到頁
  3. 視覺強調改變的元素。

目前我打算來處理這樣的:

創建鏈接,以便它們的形式是:

project2/comment.1453

創建notifications controller,其獲取projects2和改變類型comment及其編號1453。所以理論上我想重定向到projects2,並在頁面上突出顯示id爲1453的評論。問題是:在重定向之後,我如何突出評論?

notificationscontroller.rb(僞代碼!)

def show 
    project = Project.find(params[:project_id]) 
    comment = Comment.find(params[:commment_id]) 
    redirect_to project AND highlight! 
end 

在我的研究,我已經遇到骨幹,它看起來像骨幹路由器可以通過響應的URL與函數(解決這個問題突出的評論)。但我對Backbone沒有任何經驗。

我不確定這種功能的一般方法是什麼。並想避免走錯路。如果你能幫助我,那會很好。

編輯:排序一個小問題:我不確定哪個字符用於comment.1453#更好的選擇? (comment#1453

回答

4

在重定向到的頁面上,除了包含javascript之外的重定向之後,您無法運行javascript。

你想要的是從這個請求到下一個(重定向)請求的信息。

閃光燈是一個很好的方法來做到這一點。通常you'ld用它來短信:

redirect_to project, notice: "Project foo bar message" 

flash[:notice] = "Project foo bar message" 
redirect_to project 

沒有什麼阻止你在閃存使用其他標識,並在其存儲JSON。

flash[:highlight_ids] = "[12, 43, 472, 482]" 
redirect_to project 

然後在你的佈局或某處提取這種閃光消息給JavaScript:

var highlight_ids = <%= flash[:highlight_ids] %>; 

然後做你的JavaScript魔術突出的實際元素。

+0

幫手我覺得這是比存儲在cookie中的信息更清潔的方式,所以我會接受這個答案。謝謝 – wpp

2

一種可能的方式:

商店的ID(如果有必要強調指出,不僅評論可能的對象類型)在會議上或直接在Cookie(show動作在你的僞代碼)

def show 
    project = Project.find(params[:project_id]) 
    comment = Comment.find(params[:commment_id]) 
    cookies[:highlight_id] = comment.id 
    cookies[:highlight_type] = 'Comment' # optionally 
    redirect_to project 
end 

在項目控制器show行動

def show 
    ... 
    if cookies[:highlight_id] and cookies[:highlight_type] 
    @highlight_id = cookies[:highlight_id] 
    @highlight_type = cookies[:highlight_type] 
    cookies.delete[:highlight_id] 
    cookies.delete[:highlight_type] 
    end 

而且在評論觀點

<div class="some_class <%= highlight(@comment, @highlight_id, @highlight_type %>" ... 

哪裏highlight就像

def highlight(object, object_id, object_type) 
    if object_id and object_type and object.is_a?(object_type.classify.constantize) 
    'highlighted' 
    end 
end